Funciones de conversión

# Funciones de conversión para crudo
## Metro cubico a barril (_p = precio, _q = cantidad)
conversor_m3bbl_p <- function(x) {x / 6.2898}
conversor_m3bbl_q <- function(x) {x * 6.2898}

# Funciones de conversión para gas
## Pies cúbico a metro cúbico
## 1ft³= 0.02831685m³
conversor_ft3m3_p <- function(x) {x / 0.02831685}
conversor_ft3m3_q <- function(x) {x * 0.02831685}

## Pie cúbico a Millón de BTU
# 1 ft3 =  0.001028 MM BTU
conversor_ft3MMBTU_q <- function(x) {x * 0.001028}
conversor_ft3MMBTU_p <- function(x) {x / 0.001028}

## Millón de BTU a metro cúbico
## 1 MM Btu =  27,8 m3 de gas (IAPG) ó 28.32861 m3 (Canada Energy Regulator)  
conversor_MMBTUm3gas_p <- function(x) {x / 28.32861}
  
## m3 a  MMBTU de gas
# 1 m3 = 0.0353 MM BTU  (Canada Energy Regulator)
# otra opción 1 m3 = 34.121 MM BTU  (BP)
conversor_m3MMBTU_q <- function(x){x * 0.0353}
conversor_m3MMBTU_p <- function(x){x / 0.0353}

## m3 a  MMBTU (Alternativa, revisar)
# conversor_m3MMBTU_q <- function(x){x * 1/27.8}
# conversor_m3MMBTU_p <- function(x){x / 1/27.8}

## Conversión a BEP desde distintas medidas
conversor_m3bep_q <- function(x) {x * 5883}
conversor_MMBTUbep_q <- function(x) {x * 0.17245496} # BP
conversor_MMBTUbep_p <- function(x) {x / 0.17245496}
conversor_bepMMBTU_p <- function(x) {x / 5.798615}

Variables

Producción

Fuentes:

Producción de Crudo

La producción de petróleo crudo de largo plazo proviene del Anuario de Combustibles, de la cual contamos datos desde 1911 hasta 1992. Sus valores para el período 1980-1992 coinciden con los de EIA, por lo cual pueden usarse como fuentes alternativas. Asimismo, la evolución de SESCO es similar a la de EIA, salvo por pequeñas divergencias entre 2008 y 2013. La serie de Regalías presenta un nivel menor que las anteriores debido a las deducciones de producción que realizan las empresas para pagar un menor nivel de Regalías hacia las provincias donde realizan la producción. Por último, la serie del Ministerio de Economía coincide con Regalías en sus primeros años, luego presenta un nivel intermedio entre Regalías y SESCO y a partir de 2009 toma a SESCO como fuente. Salvo el Anuario de Combustibles, el resto de las series presentan datos hasta los últimos años. Por lo tanto, el criterio de selección para la serie de producción con la que se realizarán los cálculos es el siguiente:

  • Criterio de cómputo para producicón de crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream


Tabla 1. Producción de petróleo crudo en Argentina según distintas fuentes (barriles)

Producción de Gas Natural

Al igual que en la producción de petróleo crudo, la serie de largo plazo de producción de gas proviene del Anuario de Combustibles, de la cual contamos datos desde 1913 hasta 1992. A diferencia del crudo, sus valores para el período 1980-1992 no coinciden con los de EIA, pero está última sí coincide con los de Regalías entre 1999 y 2015. En cambio, la serie de SESCO, tiende a continuar la evolución de EIA y Regalías, pero con el nivel del Anuario de Combustibles, por lo que ambos pares de series pueden empalmar coherentemente según su nivel. Nuevamente, los valores de la base de Regalías son menores debido a las deducciones de producción para tributar menos regalías. La serie del Ministerio de Economía toma los valores de SESCO.Por lo tanto, el criterio de selección para la serie de producción de gas para los cálculos es el siguiente:

  • Criterio de cómputo de la producción de gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream


Tabla 2. Producción de gas natural en Argentina según distintas fuentes (MMBTU)

Produccion total

Joining, by = c("anio", "unidad")

Precio Mercado Interno

Fuentes:

  • Base Ministerio de Hacienda, Informes Sectoriales
  • Secretaría de Energía-Regalias
    • Por ausencia de información, el precio de regalias entre 1993 y 1998 es el precio total (es decir, es un ponderado que incluye también el precio del mercado externo). En los años posteriores, dicho precio sí corresponde al del mercado interno.
  • Kozulj y Pistonesi. Revista del Instituto de Economía Energética (IDEE) - Fundación Bariloche (1970 - 1988). Precio oficial interno de la cuenca neuquina a tasa de cambio oficial. Las fuentes utilizadas de esta revista son Secretaria de Energía, YPF, Gas del Estado, Boletin Informativo de Techint y series propias de IDEE
  • Memoria Anual y balances contables de YPF (varios años). Precio intero promedio resultante de la relación entre ventas y cantidades producidas.
  • Precios anuario. FALTA BUSCAR

ver de donde sacan el TCC cambiar precio del 92 por mecon estimado y valores restantes por estimado de idee

Precio Mercado Interno de Crudo

  • Criterio para precio_crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON


Tabla 3. Precio del mercado interno del petróleo crudo en Argentina según distintas fuentes (barriles)

Precio Mercado Interno de Gas Natural

  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías


Tabla 4. Precio del mercado interno del gas natural en Argentina según distintas fuentes (barriles)

Precios de Referencia del Mercado Mundial

Precios de exportación desde Argentina, benchmarks y Precios del mercado de EEUU (solo gas, internos y de expo/impo)

Precios de Referencia del Crudo

  • Fuentes seleccionadas para precio_me_crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade (clasificación SITC as reported)
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992 (1970 - 1985): Brent (Fuente: Inflation Data)

Falta construir una paridad de expo/impo con el flete

Precios de Referencia del Gas

  • Criterio de precio_externo_gas:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
Exportación Argentina
Referencias mundiales
Bolivia
Todos los precios

buscamos un precio

cuanto es una cantidad de btu de gas al precio de referencia (ej bolivia) y cuanto es si convierto esos btu a barriles y los valorizo con el precio del barril? cuanto queda la unidad en btu si tomo el precio de petroleo y lo covierto a btu. es decir, cuanto es el valor si la valorizo en precio del petroleo

¿cuantos usd es un btu de petroleo? si tomo un barril de petroleo y lo convierto a btu ( me va a dar cuantos USD es un btu) luego comparo los USD/btu y lo comparo con el gas de bolivia

grinber: convierte todo el gas en petroleo y le pone el precio de petroeloe. subestima los precios del gas?

Exportaciones e Importaciones

Exportaciones e Importaciones de Crudo

  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84

Exportaciones e Importaciones de Gas

  • Fuentes seleccionadas:
  • 1962 a 1996: UN Comtrade,
  • 1997 en adelante: SESCO Downstream
  • Datos faltantes para los años 1999 y 2000

Empleo, Remuneraciones y Masa Salarial (CCNN)

Pozos

Metros perforados

Fuente:

Pozos en operación

Fuentes:

  • Secretaría de Energía - Datos MINEM:
    • Listado de pozos cargados por empresas operadoras: se toma la variable “Fecha del Fin de terminación de perforación del pozo” (adjiv_fecha_fin_term) como año de puesta en producción del pozo. Se podría elaborar un stock de pozos a partir de acumular los pozos terminados y restando los pozos abandonados, agrupando con la variable “Fecha de abandono del pozo”(adjiv_fecha_abandono)
    • Pozos terminados
    • Capítulo IV
    • Estado de pozos (AUN NO SE PROCESÓ ESTA BASE NI LA ANTERIOR)
    • SESCO
  • IAPG. Se presentan dos series: una elaborada a partir de los pozos perforados por año (resultante de descargar una base por cada año del sitio web oficial) y otra que corresponde al stock de pozos de petróleo de extracción efectiva (procedente de los datos de Estadísticas del Centenario de IAPG).

ver relaciones * PBI hidrocarburos / PBI total (ver cual elegir) * corregir nuestro VBP depurando servicios * MIP’s coef tecnico (para ver CI en el sector petrolero y peso del sector petrolero en PBI)

  • stock petrolero / stock total JIC,EM
  • Stock extraccion = PPyE PAE + PPyE Tecp + PPyE Petrobras upstr + Activo YPF upstream
    • ver que porcentaje que representan estas empresas en la produccion o pozos y ver de ampliarlo
    • ver relacion Activo YPF upstream / PPyE integrada YPF
    • ver relacion ganancias AFIP y BOLSAR con el stock correspondiente (coherencia)
    • ver relacion con Coremberg
    • pasar ENGE

grinberg convertir lo nuestro a costos. agarrar nuestros valor y dividirlo por barriles (sumando gas en BOE) * costos por bbl, precio el barril y precio de produccion (sumo la gcia normal al costo1)

Activos

Pasar datos de bs de uso en yacimientos para armar relación activo yacimeinto/total

Fuentes:

  • Balances de Bolsar (unicamente empresas que cotizan en la bolsa de valores argentina). Revisar el stock del sector distribución porque se presenta demasiado grande con respecto al de los demás. Falta pasar los datos del activo de casi todas las empresas

  • AFIP. Con esta fuente no tenemos calculo de renta, sino que solo usamos la TG como parámetro. Nota: "_c" significa casos presentados de la variable correspondiente

  • Memorias de YPF. La década de los 80 presenta picos que hay que revisar

  • Calculo del Capital Total Adelantado (KTA)

    • Bolsar: Es equivalente a la suma de Propiedad, Planta y Equipos Neta (descontando los terrenos y obras en curso) y los Inventarios. Cuando los datos lo habilitan, se le agregó los salarios adelantados (salarios y cargas consumidos sobre rotación). Luego, cuando no se presentaron datos de Propiedad, Planta y Equipos, se tomó el activo no corriente.
    • AFIP: Es equivalente a la suma de Bienes de Uso, Bienes de Cambio, Inventarios y Disponibilidades.
    • Memoria YPF: Suma de Bienes de Uso y Bienes de Cambio

Stock total de la rama

Stock de segmentos de YPF y Petrobras

Stock por empresas

YPF largo plazo

Comparación entre la Memoria YPF (recopilado por BFR) y los balances extríados de Bolsar

Estimación de stock de capital a partir de la evolución de pozos perforados

El ejercicio consiste en verificar si los pozos terminados sirven como indicador de la inversión y, por lo tanto, de aproximador al stock de capital adelantado. Para ello se parte de un año base de la serie de Propiedad, Planta y Equipo del sector extracción de Bolsar y AFIP, para luego indexar las variables por la evolución de los pozos. Los balances de Bolsar que corresponden únicamente a extracción son dos: PAE y Tecpetrol, por lo que el valor obtenido puede estar subrepresentado para dar cuenta del total de la rama. Con respecto al índice de pozos, se tomaron dos series alternativas: una construída a partir del stock de pozos en extracción efectiva (fuente: IAPG) y otra elaborada con los pozos terminados anuales cargados por empresa operadora (fuente: Secretaría de Energía).

El año base elegido es 2006, dado que es el último dato que poseemos del stock de pozos totales en actividad de IAPG.

Se realizó la misma estimación para YPF, filtrando las variables de Propiedad, Planta y Equipo (para el total de la empresa, por lo que incluye no sólo extracción sino refinación y otros rubros) y activo total del upstream. Se utilizó únicamente el indice de pozos terminados anuales de YPF para estimar la PPyE y el activo, dado que no se posee valores del stock de pozos en perforación para los años en donde existen valores contables que sirvan de año base. Luego, se estimó un stock de capital total de rama a partir de ponderar el stock de YPF por la relación entre los pozos de YPF y los pozos totales de la rama.

En síntesis, el listado de variables estimadas- a partir de las dos series de pozos (stock y flujo),salvo para la estimación de YPF que solo se pudo hacer con flujo de pozos por ausencia de información- es las siguientes:

  • \(ppye\_estimado\_bolsar\) = \(PPyE\ año\ base\ de\ Bolsar\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_afip\) = \(PPyE\ año\ base\ de\ AFIP\) * \(indice\ de\ pozos\)

  • \(ppye\_estimado\_ypf\) = \(PPyE\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(activo\_estimado\_upstream\_ypf\) = \(Activo\ año\ base\ de\ YPF\) * \(indice\ de\ pozos\ YPF\)

  • \(ppye\_estimado\_total\) = \(ppye\_estimado\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

  • \(activo\_estimado\_upstream\) = \(activo\_estimado\_upstream\_ypf\) * \[\frac{pozos\ totales}{pozos\ de\ YPF}\]

Para poder seleccionar la estimación más adecuada, se realizó un análisis de correlación entre todas las series estimadas y los valores contables que se poseen de PPyE de AFIP, Bolsar e YPF. Se presentan distintos cuadros de correlaciones, con sus nivles de significancia, diagramas de dispersión entre variables y su distribución. Las series construídas que poseen mejor correlación son la Propiedad, Planta y Equipo a partir de Bolsar estimadas con índice de stock de pozos (correlación fuerte de 0.89 y significativa al 0.001) y flujo de pozos (correlación moderada de 0.54 y significativa al 0.05) y luego el activo del upstream total de la rama a partir de YPF (correlación moderada de 0.42 y significativa al 0.1 con los valores contables de YPF y correlación fuerte de 0.88 y significativa al 0.001 con las estimaciones de PPyE de AFIP y Bolsar a partir de flujo de pozos).

la estimación tiene que realizarse con PPyE porque hay que excluir salarios e inventarios (que están en KTA)

Análisis de correlacion entre Propiedad, Planta y Equipo y Pozos en producción

reemplazar ipc por un ibif o indice especifico

Total rama

                  ppye_afip ppye_bolsar pozos_iapg pozos_terminados pozos_cargados
ppye_afip         1.0000000   0.1743854 -0.2930975       -0.6054224     -0.3793896
ppye_bolsar       0.1743854   1.0000000 -0.4269400       -0.5803358     -0.3213849
pozos_iapg       -0.2930975  -0.4269400  1.0000000        0.8924037      0.9611781
pozos_terminados -0.6054224  -0.5803358  0.8924037        1.0000000      0.8696256
pozos_cargados   -0.3793896  -0.3213849  0.9611781        0.8696256      1.0000000

Joining, by = c("anio", "unidad")
Stock de pozos

             ppye_afip ppye_bolsar pozos_iapg
ppye_afip    1.0000000   0.8382675 -0.9152596
ppye_bolsar  0.8382675   1.0000000 -0.9096424
pozos_iapg  -0.9152596  -0.9096424  1.0000000

YPF
                activo_upstream ppye_integrada      pozos
activo_upstream       1.0000000     0.22492855 0.51192183
ppye_integrada        0.2249285     1.00000000 0.06456351
pozos                 0.5119218     0.06456351 1.00000000

PPyE y activo upstream total rama a partir de YPF
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = "anio"
Joining, by = "anio"

Inversiones

Fuentes:

  1. construir serie de inversión para atras (buscar Stock de YPF pero solo para extracción). armar ejercicio de FD y ver si las proporciones se mantienen.
  • Reconstruccion de serie de inversion por empresa ver un flujo de pozos y un flujo de inversion y luego ver si lo que mueve la inversion son los pozos (que su evolucion sea similar).

  • inversion por empresa (balance: variacion del activo + consumo de K fijo)

  • inversion por empresa (secretaria de energia)

  • inversion agregada (tipo de inversion) (cuentas nacionales?)

  • pozos nuevos por empresa por año

  • pozos nuevos totales

  • aplicar MIP para YPF

Inversión a partir de Balances

Inversión a partir de Secretaria de Energía

Análisis de correlación entre Inversión y Pozos

  • buscar correlacion, para ver si la serie de inversión se mueve similar a los pozos
  • usar stock y ademas usar variacion de stock (bs de uso)

Con pozos de IAPG

Con pozos Cap IV

Regalías

  • Fuentes:
    • Secretaría de Energía (Base Regalías)

REVISAR EL CALCULO DE BETANIA cuanto ganarian las provincias si el precio del mercado interno se acomoda al internacional?

Subsidios

Joining, by = "anio"
NAs introducidos por coerci昼㸳n

Valor total de la producción

Criterios metodológicos

Se presentan a continuación distintas estimaciones sobre la magnitud de riqueza presente en el sector hidrocarburífero: Valor Bruto y Agregado de Producción (VBP y VA), Consumo Interemedio (CI), Masa Salarial (MS) y Excedente Bruto de Explotación (EBE). El VBP surge de la valuación de la producción a sus precios correspondientes. El VA resulta de la diferencia entre el VBP y CI, el cual puede surgir originalmente de esta resta o a partir del coeficiente técnico de la Matriz Insumo Producto (MIP). El EBE constituye la plusvalía (PV) total de la rama, es decir, la suma de la renta de la tierra (RT) más la ganancia normal (Gnorm), y se obtiene luego de descontar la MS y los impuestos específicos (Imp) del VA. En todos los casos que se presentarán a continuación, los Imp se calcularon a partir de aplicar sobre el VBP un coeficiente resultante del peso de los impuestos promedio de la MIP de 1997. Lo mismo pasa con la estimación de la depreciación de capital o consumo de capital fijo (ConsKfijo), que se obtiene a partir de aplicar la tasa de depreciación promedio resultante de los balances de YPF (1998 - 2018) sobre el total de Propiedad, Planta y Equipo (PPyE) de la rama. Esta partida se aplica para obtener el Excedente Neto de Explotación. Se presentan distintas estimaciones para el VBP, CI y MS, que luego se observarán en la formulación matemática:

  • CCNN (ccnn_oficial)
    • Valores contables oficiales de las Cuentas Nacionales (sólo disponible para el período 2004-2012). Dado que se presentan series de VBP y VA, se pudo estimar el CI como la diferencia de dichas cuentas. Se procedió a separar el VBP a partir del peso del VBP de los servicios de apoyo a la extracción sobre el VBP de extracción de petróleo y gas, presente en el Cuadro de Utilización de Oferta (COU) de 2004 de INDEC. Se descontó esta proporción (resultante del 10,7%) del VBP total para obtener un VBP sólo de extracción. Dado que se posee información del salario promedio del sector y el empleo, se pudo obtener la MS resultante, tanto para el total del sector (extracción y servicios relacionados) como para sólo extracción. A partir de estos datos se elaboró un coeficiente que refleja el promedio de la proporción de la MS sobre el VBP que se utilizará en cálculos posteriores de MS total y MS de extracción.
  • Estimación propia con criterio CCNN (vbp_va_ci_propia)
    • Estimación propia de los valores contables a partir de las fuentes recopiladas, siguiendo los criterios de las Cuentas Nacionales. Es decir, para obtener el VBP se valua la producción destinada al mercado interno (resultante a partir de la diferencia entre producción y exportaciones) con los precios internos y las exportaciones con los precios de exportación, valuados tipo de cambio comercial (TCC). Se procedió también a separar el VBP de extracción neto de los servicios tal como se explicó anteriormente. El CI se estimó a partir de aplicar el coeficiente técnico (ratio CI/VBP) resultante de la MIP de 1997 (equivalente a 0.272). De igual manera, para calcular la masa salarial se aplicó el coeficiente de MS mencionado anteriormente. Finalmente, como se mencionó anteriormente, el VA el EBE se calcularon a partir de las diferencias mencionadas anteriormente.
  • Empalme CCNN (vbp_ccnn)
    • Estimación que toma los valores oficiales de las cuentas nacionales para el período donde se presentan datos (2004 -2012) y que imputa los valores faltantes por medio de la evolución del índice del VBP propio con criterio CCNN explicado anteriormente. Asimismo, se utilizaron los valores oficiales de la MS cuando se encontraba disponible el dato (1996-2018), mientras que se utilizó el valor propio estimado con criterio de las CCNN para los restantes años.
  • Criterio Propio (pv_hidrocarburos_propia)
    • Estimación propia que refleja con mayor precisión el valor de la riqueza total presente en el sector. El VBP se obtiene a paritr de valuar la totalidad de la producción a los precios externos o de referencia internacional y con el tipo de cambio de paridad (TCP), que mide la capacidad real de compra de la moneda nacional. Sin embargo, como el CI constituye intercambios de mercancías realizadas en el ámbito nacional, dicha partida se obtiene a partir de los valores obtenidos en la serie de empalme CCNN. De igual manera, se utilizó la MS resultante de esta última estimación.

Formulación matemática de estimaciones

Valor Bruto de Producción total, estimación con criterio propio \[VBP_{propia} = (Pext_{petróleo} * Q_{petróleo} + Pext_{gas} * Q_{gas}) * TCP\]

Donde:

  • \(VBP_{propia}\) = Valor Bruto de la Producción total, estimación propia
  • \(Pext_{petróleo}\) = Precio de exportación o referencia internacional del petróleo crudo (según corresponda)
  • \(Pext_{gas}\) = Precio de exportación o referencia internacional del gas natural (según corresponda)
  • \(Q_{petróleo}\) = Cantidades producidas totales de petróleo crudo
  • \(Q_{gas}\) = Cantidades producidas totales de gas natural
  • \(TCP\) = Tipo de Cambio de Paridad

Valor Bruto de Producción total, estimación con criterio CCNN \[VBP_{CCNN} = (Pint_{petróleo} * QMInt_{petróleo} + Pext_{petróleo} * Expo_{petróleo} + Pint_{gas} * QMInt_{gas} + Pext_{gas} * Expo_{gas})* TCC\]

Donde:

  • \(VBP_{CCNN}\) = Valor Bruto de la Producción total, estimación propia con criterio de las CCNN
  • \(Pint_{petróleo}\) = Precio mercado interno del petróleo crudo
  • \(Pint_{gas}\) = Precio mercado interno del gas natural
  • \(QMInt_{petróleo}\) = cantidades vendidas al mercado interno de petróleo crudo
  • \(QMInt_{gas}\) = cantidades vendidas al mercado interno del gas natural
  • \(Expo_{petróleo}\) = exportaciones de petróleo crudo
  • \(Expo_{gas}\) = exportaciones de gas natural
  • \(TCC\) = Tipo de Cambio Comercial


Valor Bruto de Producción extracción, estimación con criterio CCNN

\[VBP\_extr_{CCNN} = VBP_{CCNN} * (1-prop\_servicios)\]

Donde:

  • \(VBP\_extr_{CCNN}\) = Valor Bruto de la Producción extracción, estimación propia con criterio de las CCNN
  • \(prop\_extr\) = proporción del VBP de servicios de apoyo sobre VBP de extracción de petróleo y gas

Proporción de los servicios de apoyo sobre la extracción de petróleo y gas
\[prop\_servicios = \frac{VBP\_servicios_{COU}}{VBP\_extr_{COU} + VBP\_servicios_{COU}}\]

Donde:

  • \(VBP\_servicios_{COU}\) = VBP de servicios de apoyo del Cuadro de Utilización de Oferta
  • \(VBP\_extracción_{COU}\) = VBP de extracción de petróleo y gas del Cuadro de Utilización de Oferta


Consumo Intermedio, valores oficiales de las CCNN \[ CI_{CCNN} = VBP_{CCNN} - VA_{CCNN} \]

Donde:

  • \(CI_{CCNN}\) = Consumo Intermedio total, estimación propia
  • \(VA_{CCNN}\) = Valor Agregado, estimación de las CCNN


Consumo Intermedio, estimación con criterio CCNN \[ CI_{CCNN} = VBP_{CCNN} * Coef\_tec \] Donde:

  • \(Coef\_tec\) = Coeficiente técnico de Matriz Insumo Producto


Consumo Intermedio de extracción, estimación con criterio CCNN

\[ CI\_extr_{CCNN} = VBP\_extr_{CCNN} * Coef\_tec \]

Donde:

  • $ CI_extr_{CCNN}$ = Consumo Intermedio de extracción, estimación criterio CCNN


Masa Salarial, valores oficiales de las CCNN \[MS = W * Emp * 13\] Donde:

  • \(MS\) = Masa Salarial
  • \(W\) = Salario anual promedio
  • \(Emp\) = Empleo


Masa Salarial, estimación con criterio CCNN \[MS = VBP_{CCNN} * Coef\_MS\]

Donde:

  • \(Coef\_MS\) = Coeficiente de la proporción de MS sobre VBP


Masa Salarial de extracción, estimación con criterio CCNN \[MS\_extr = VBP\_extr_{CCNN} * Coef\_MS\]

Donde:

  • \(MS\_extr\) = Masa salarial del sector extracción


Valor agregado, estimación criterio CCNN \[VA_{CCNN} = VBP_{CCNN} – CI_{CCNN} \] Donde:

  • \(VA_{CCNN}\) = Valor Agregado, estimación propia con criterio CCNN


Valor agregado de extracción, estimación con criterio CCNN \[VA\_extr_{CCNN} = VBP\_extr_{CCNN} – CI\_extr_{CCNN} \]

Donde:

  • \(VA\_extr_{CCNN}\) = Valor Agregado de extracción, estimación propia con criterio CCNN


Valor agregado, estimación con criterio propio \[VA_{propia} = VBP_{propia} – CI\_extr_{CCNN} \]

Donde:

  • \(VA_{propia}\) = Valor Agregado, estimación con criterio propio


Excedente Bruto de Explotación, estimación con criterio CCNN \[EBE_{CCNN} = VA_{CCNN} – MS \]

Excedente Bruto de Explotación de extracción, estimación con criterio CCNN \[EBE\_extr_{CCNN} = VA\_extr_{CCNN} – MS\_extr \]


Excedente Bruto de Explotación, estimación con criterio propio \[EBE_{propia} = VA_{propia} – MS\_extr \]

Donde:

  • \(EBE\) = Excedente Bruto de Explotación
  • \(CI\_extr_{CCNN}\) = Consumo intermedio del sector extracción, estimación con criterio CCNN


Consumo de Capital Fijo, estimación con criterio propio \[ConKfijo = PPyE * prom(\frac{Dep}{PPyE}) \]

Donde:

  • \(ConKfijo\) = Consumo de Capital Fijo
  • \(PPyE\)= Propiedad, Planta y Equipo neta
  • $prom() $ = tasa de depreciación promedio
  • \(Dep\) = Depreciaciones (cuenta gastos por naturaleza)


Plusvalía (Excedente Neto de Explotación), estimación con criterio propio \[PV_{propia} = VA_{propia} - ConKfijo - Imp \]

Donde:

  • \(PV_{propia}\) = Plusvalía (Excedente Neto de Explotación)
  • \(Imp\) = Impuestos normales

Fuentes para la construcción de series

  • Producción de Crudo:
    • 1911 a 1992: Anuario de combustibles
    • 1993 - actualidad: SESCO Downstream
  • Exportaciones de Crudo:
    • 1962 a 1993: UN Comtrade (clasificación SITC as reported)
    • 1994 en adelante: SESCO Downstream
    • Los datos faltantes de SESCO se completaron con MECON
    • Siguen habiendo datos faltantes para los años 1965, 1970-74, 1976-78, 1980-84
  • Precio Mercado Interno de Crudo:
    • 1963 a 1965: Kozulj y Pistonesi - Revista IDEE ajustado con el índice del precio del Anuario de YPF
    • 1989 a 1991: Anuario de YPF
    • 1966 a 1988: Kozulj y Pistonesi - Revista IDEE
    • 1992: MECON ajustado con la variación del Índice de precios internos al por mayor (IPIM)
    • 1993 en adelante: MECON
  • Precio Mercado Externo Crudo:
    • entre 1962 y 1992: precio de exportación argentina de UN Comtrade
    • entre 1993-2001 y 2004-2014: precio de exportación argentina de Mecon
    • entre 2002 y 2003: precio de exportación de Argentina de UN Comtrade (Clasificación HS as reported)
    • 2014 en adelante: precio de exportación argentina de Secretaría de Energía (Regalías)
    • Valores faltantes previos a 1992: Brent (Fuente: Inflation Data)
  • Producción de Gas:
    • 1911 a 1992: Anuario de combustibles
    • 1993 en adelante: SESCO Downstream
  • Exportaciones de gas:
    • 1962 a 1996: UN Comtrade,
    • 1997 en adelante: SESCO Downstream
    • Datos faltantes para los años 1999 y 2000
  • Precio Mercado Interno de gas:
    • 1963 - 1969 & 1989 - 1992: Anuario de YPF
    • 1970 - 1988: Kozulj y Pistonesi - Revista IDEE
    • 1993 en adelante: Secretaría de Energía - Base Regalías
    • El dato del año 1992 se dividió por 10, dado que resultaba excesivamente alto, lo cual es metodológicamente inaceptable pero sirve de ejercicio.
  • Precio Mercado Externo:
    • Años 1964 y 1965: Precio de importación de gas proveniente de Bolivia hacia Argentina de UN Comtrade
    • 1966 en adelante: Precio de exportacion de gas desde Bolivia a Argentina de UN Comtrade
    • Datos faltantes para los años previos a 1963 y período 1968-1971
  • Valor Bruto de la Producción, Valor Agregado y Consumo Intermedio:
    • INDEC - Dirección Nacional de Cuentas Nacionales (Base Minería e Hidrocarburos de las Cuentas Nacionales). Las variables “extraccion_y_servicios_hidrocarburos” refieren a “Extracción de petróleo crudo y gas natural. Actividades de servicios relacionadas con la extracción de petróleo y gas, excepto las actividades de prospección”
    • Cálculo propio del VBP con datos datos de producción y precio internacional recopilados. Las fuentes son las siguientes (los criterios son los mismos para la utilización posterior en el cálculo de renta de la tierra hidrocarburífera por diferencial de precios, sobrevaluación cambiaria y otros mecanismos)
  • Salario y empleo
    • 1960-1996: estimación a partir de aplicación del coeficiente de proporción de la masa salarial sobre el VBP
    • 1996 en adelante: Ministerio de Trabajo, Empleo y Seguridad Social - Observatorio de Empleo y Dinámica Empresarial (OEDE)
  • Consumo de capital fijo
    • Coeficiente de depreciación estimado a partir de Estados Contables de YPF (1998-2018)

Cuentas Nacionales

Producto Interno Bruto Explotación Minas y Canteras Millones de pesos constantes. Base 1960. Valores trimestrales PIB Explotación Minas y Canteras en millones de pesos de 1960. 1970-1980

Producto Interno Bruto Explotación Minas y Canteras, Australes constantes. Base 1970.Valores trimestrales PIB Explotación Minas y Canteras en australes a precios de 1970. 1980-1990

Estimaciones propias

Tasa de Ganancia

\[TG_{hidrocarburos} = \frac{PV_{hidrocarburífera}}{KTA_{hidrocarburífero}}\]

Por empresa

Por subsector

`summarise()` has grouped output by 'fecha'. You can override using the `.groups` argument.

##Total rama

Renta apropiada por las empresas de la rama

La renta apropiada por las empresas de la rama se calcula por medio del diferencial de tasas de ganancia entre el sector hidrocarburífero que surge a partir de los balances y la rentabilidad normal de la economía.

\[Renta\_empresas = KTA_{hidrocarburífero} * (TG_{hidrocarburífera} - TG_{referencia})\] \[TG_{hidrocarburífera} = \frac{Gcia_{hidrocarburos}}{KTA_{hidrocarburífero}}\] Por lo cual, la renta apropiada por las empresas de la rama sería equivalente a:

\[Renta\_empresas = Gcia_{hidrocarburos} - KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburífero}\) = Stock de capital adelantado de empresas hidrocarburíferas
  • \(TG_{hidrocarburífera}\) = Tasa de ganancia de empresas hidrocarburíferas
  • \(TG_{referencia}\) = Tasa de ganancia de referencia
  • \(Gcia_{hidrocarburos}\) = Ganancia de empresas hidrocarburíferas
Joining, by = "anio"

Renta por el diferencial de precios entre el mercado interno y las referencias internacionales

Renta apropiada mediante el abaratamiento en el consumo interno por efecto del diferencial de precios interno/externo, sobrevaluación de la moneda y retenciones a la exportación

Criterio de cómputo de JK (variable ‘renta_dif_precios’)

\[RDP= ProdInt * Pext * TCP - ProdInt * PMI * TCC\]

Donde:

  • \(RDP\) = Renta apropiada por efecto diferencial de precios interno/externo y sobrevaluación
  • \(MdoInt\) = Producción destinada al Mercado Interno: Producción - Exportaciones - Existencias (barriles de petróleo ó MMBTU)
  • \(Pext\) = Precio de referencia del mercado externo (USD)
  • \(PMI\) = Precio de venta del mercado interno (USD)
  • \(TCP\) = Tipo de Cambio de Paridad
  • \(TCC\) = Tipo de Cambio Comercial

Criterio de cómputo de JIC y cia (variable ‘renta_abaratamiento_sobrevaluacion’)

\[RDP = MdoInt * PMI * (\frac{TCP}{TCC} - 1)\]

Renta apropiada por sobrevaluación cambiaria

\[Rsobrevaluacion = Expo * Pext * (TCP - TCC)\]

Donde: * \(Rsobrevaluacion\) = Renta apropiada por exportaciones con tipo de cambio sobrevaluado * \(Expo\) = Exportaciones (barriles de petróleo ó MMBTU) * \(Pext\) = Precio de referencia del mercado externo (USD) * \(TCP\) = Tipo de Cambio de Paridad * \(TCC\) = Tipo de Cambio Comercial

Joining, by = "anio"

Renta apropiada por el Estado mediante impuestos específicos

Joining, by = "anio"
Joining, by = c("anio", "unidad")
`summarise()` has grouped output by 'anio'. You can override using the `.groups` argument.
Joining, by = c("anio", "unidad")

\[Rimp = RE + Reg\]

Donde:

  • \(Rimp\) = Renta apropiada por el Estado mediante impuestos específicos
  • \(RE\) = Retenciones
  • \(Reg\) = Regalias

Renta apropiada por consumidores y refinerías y procesadoras

Criterio de cómputo de Ramón (2019)

Refinerías y procesadoras

\[RR = (PI - PRMi) * CrudoP\]

  • \(RR\) = Renta apropiada por las Refinadoras
  • \(PI\) = promedio ponderado de Precios Internacionales
  • \(PRMi\) = Precio ponderado a Refinerías del Mercado Interno
  • \(CrudoP\) = barriles de Crudo Procesado por las refinadoras

Consumidores

\[RC = (PI - PRMi - MR) * CrudoP \]

  • \(RC\) = Renta apropiada por los Consumidores
  • \(MR\) = Margen de Refinerías

Esto resulta equivalente a plantear:

\[RC = PCMi * CrudoP\]

  • \(PCMi\) = Precio ponderado a Consumidores del Mercado Interno.

Renta Hidrocarburífera Total. En precios constantes, sobre Plusvalía Total y PBI

Existen dos caminos para llegar al monto total de renta de la tierra hidrocarburífera: uno es descontando la ganancia normal de las empresas a la plusvalía total del sector y el otro es por medio de la suma de mecanismos de apropiación.

\[Renta\_hidrocarburífera = PV_{hidrocarburífera} - Gcia\_Normal_{hidrocarburífera}\] Donde:

  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia Normal del sector hidrocarburífero
  • \(PV_{hidrocarburífera}\) = Plusvalía del sector hidrocarburífero

\[Gcia\_Normal_{hidrocarburífera} = KTA_{hidrocarburífero} * TG_{referencia}\]

Donde:

  • \(KTA_{hidrocarburos}\) = Stock de capital adelantado del sector hidrocarburífero
  • \(TG_{referencia}\) = Tasa de ganancia normal de referencia.

En este caso, seleccionamos la tasa de ganancia del sector industrial como parámetro para diferenciar la renta de la ganancia. A su vez, para el capital total adelantado de las empresas hidrocarburíferas, seleccionamos unicamente el valor resultante de la estimación de la PPyE de Bolsar a partir del indice de flujo de pozos (variable “ppye_bolsar_flujo”), por lo que le faltan los inventarios y salarios adelantados.

El cálculo de renta total hidrocarburífera que se obtiene por medio de descontar la ganancia normal a la plusvalía total del sector, debe ser igual a la renta obtenida por medio de la agregación de los distintos mecanismos de apropiación. Es decir:

\[Renta\_hidrocarburífera = Renta\_diferencial\_precios + Renta\_sobrevaluación + Renta\_empresas + Impuestos\_netos\_específicos \] \[Impuestos\_netos\_específicos = Retenciones + Regalías - Subsidios\]

Método directo (a partir de descuentos sobre el VBP)

Joining, by = "anio"
Joining, by = "anio"

Método indirecto (suma de mecanismos)

Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
`mutate_all()` ignored the following grouping variables:
Column `anio`
Use `mutate_at(df, vars(-group_cols()), myoperation)` to silence the message.
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Removed 21 rows containing missing values (position_stack).'big.mark' and 'decimal.mark' are both '.', which could be confusing
'big.mark' and 'decimal.mark' are both '.', which could be confusing

Costos

\[Q\_total = Q_{petróleo} + Q_{gas} \] Donde:

  • \(Q\_total\) = Cantidades producidas de petróleo y gas en Barriles Equivalentes de Petróleo
  • \(Q_{petróleo}\) = Cantidades producidas de petróleo crudo en barriles equivalentes de petróleo (BOE)
  • \(Q_{gas}\) = Cantidades producidas de gas natural en barriles equivalentes de petróleo (BOE)

\[ Costos\_totales = CI + MS + ConKfijo\]

Donde:

  • \(Costos\_totales\) = Costos totales hidrocarburíferos
  • \(CI\) = Consumo Intermedio, distintas estimaciones
  • \(MS\) = Masa Salarial, distintas estimaciones
  • \(ConKfijo\) = Consumo de Capital Fijo

\[Costos\_totales\_con\_Gcia = Costos\_totales + Gcia\_Normal_{hidrocarburífera} \] Donde:

  • \(Costos\_totales\_con\_Gcia\) = Costos totales hidrocarburíferos con ganancia normal
  • \(Gcia\_Normal_{hidrocarburífera}\) = Ganancia normal del sector hidrocarburífero

\[ Precio\_costo = \frac{Costos\_totales}{Q\_total} \] Donde: * \(Precio\_costo\) = Precio de costo en BOE

A partir de esto se puede calcular un costo recuperable del petróleo y del gas

\[Costo\_crudo = Q_{petróleo} * Precio\_costo\] \[Costo\_gas = Q_{gas} * Precio\_costo\]

\[Precio\_produccion = \frac{Costos\_totales\_con\_Gcia}{Q\_total}\]

\[Precio\_vta\_potencial = \frac{Q\_total*Pext_{petróleo} - Costos\_totales}{Q\_total} \]

Donde: * \(Precio\_produccion\)= Precio de produccion * \(Precio_vta_potencial\) = Precio de venta potencial * \(Pext_{petróleo}\) = Precio de exportación/referencia internacional del petróleo crudo

Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "ipc_18")
Joining, by = "anio"
Joining, by = "anio"
Joining, by = "anio"
Joining, by = c("anio", "unidad")

Comparación con estimación de otros autores

'big.mark' and 'decimal.mark' are both '.', which could be confusing

Exportacion de resultados

LS0tDQp0aXRsZTogIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBlbiBBcmdlbnRpbmEgKDE5NjAgLSAyMDE4KSINCmF1dGhvcjoNCi0gYWZmaWxpYXRpb246IFVOR1MvQ09OSUNFVA0KICBuYW1lOiBNYXRlbyBTdXN0ZXIgeSBKdWFuIEtvcm5ibGlodHQNCm91dHB1dDoNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIGtlZXBfdGV4OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICB0b2M6IHllcw0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQo8YnI+DQo8YnI+DQoNCjxjZW50ZXI+IDxoMT48L2gxPiA8L2NlbnRlcj4gDQoNCg0KDQpgYGB7cn0NCiMgcGFyYSBndWFyZGFyIGdncGxvdCBjb24gdGFtYcOxbw0KIyBnZ3NhdmUoImZhY2V0X3dyYXBfY2hhcnQucG5nIiwgZmFjZXRfd3JhcF9jaGFydCwgd2lkdGggPSAxNjgwLzcyLCBoZWlnaHQgPSAxMDUwLzcyLCBkcGkgPSA3MikNCg0KYGBgDQoNCiAgDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBsaWJyYXJ5KHh0YWJsZSkgIyBlaiB4dGFibGUodGFibGEpIHBhcmEgcGFzYXIgYSBsYXRleA0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCg0KbGlicmFyeShyZWFkeGwpIA0KIyBsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZnMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoaHV4dGFibGUpICNyZXZpc2FyIGVzdG8gcGFyYSBkYXIgZm9ybWF0byBhbCBlamUgWQ0KIyBsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShIbWlzYykNCmxpYnJhcnkoem9vKQ0KDQpvcHRpb25zKHNjaXBlbiA9IDk5OTk5OTkpDQoNCiMgYWdyZWdhciBsYWJlbCBwYXJhIHZhcmlhYmxlcyBkZSBncmFmaWNvcyANCiNmYWNldHdyYXAofiBleHBlcmltZW50b3gsIGxhYmVsbGVyID0gYXNfbGFiZWxsZXIoZXhwX25hbWVzKSkrICANCg0KYGBgDQoNCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIA0KDQoqIFtDYW5hZGEg4oCTIE5hdGlvbmFsIEVuZXJneSBCb2FyZC4gRW5lcmd5IENvbnZlcnNpb24gVGFibGVzXShodHRwczovL2FwcHMuY2VyLXJlYy5nYy5jYS9Db252ZXJzaW9uL2NvbnZlcnNpb24tdGFibGVzLmFzcHg/R29DVGVtcGxhdGVDdWx0dXJlPWVuLUNBIzItMykNCiogW0JQXShodHRwczovL3d3dy5icC5jb20vY29udGVudC9kYW0vYnAvYnVzaW5lc3Mtc2l0ZXMvZW4vZ2xvYmFsL2NvcnBvcmF0ZS9wZGZzL2VuZXJneS1lY29ub21pY3Mvc3RhdGlzdGljYWwtcmV2aWV3L2JwLXN0YXRzLXJldmlldy0yMDE5LWFwcHJveGltYXRlLWNvbnZlcnNpb24tZmFjdG9ycy5wZGYpDQoqIFtFSUFdKGh0dHBzOi8vd3d3LmVpYS5nb3Yva2lkcy93aGF0LWlzLWVuZXJneS9lbmVyZ3ktY2FsY3VsYXRvcnMucGhwI25hdGdhc2NhbGMpDQoNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBGdW5jaW9uZXMgZGUgY29udmVyc2nDs24gcGFyYSBjcnVkbw0KIyMgTWV0cm8gY3ViaWNvIGEgYmFycmlsIChfcCA9IHByZWNpbywgX3EgPSBjYW50aWRhZCkNCmNvbnZlcnNvcl9tM2JibF9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gNi4yODk4fQ0KY29udmVyc29yX20zYmJsX3EgPC0gZnVuY3Rpb24oeCkge3ggKiA2LjI4OTh9DQoNCiMgRnVuY2lvbmVzIGRlIGNvbnZlcnNpw7NuIHBhcmEgZ2FzDQojIyBQaWVzIGPDumJpY28gYSBtZXRybyBjw7piaWNvDQojIyAxZnTCsz0gMC4wMjgzMTY4NW3Csw0KY29udmVyc29yX2Z0M20zX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjAyODMxNjg1fQ0KY29udmVyc29yX2Z0M20zX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjAyODMxNjg1fQ0KDQojIyBQaWUgY8O6YmljbyBhIE1pbGzDs24gZGUgQlRVDQojIDEgZnQzID0gIDAuMDAxMDI4IE1NIEJUVQ0KY29udmVyc29yX2Z0M01NQlRVX3EgPC0gZnVuY3Rpb24oeCkge3ggKiAwLjAwMTAyOH0NCmNvbnZlcnNvcl9mdDNNTUJUVV9wIDwtIGZ1bmN0aW9uKHgpIHt4IC8gMC4wMDEwMjh9DQoNCiMjIE1pbGzDs24gZGUgQlRVIGEgbWV0cm8gY8O6Ymljbw0KIyMgMSBNTSBCdHUgPSAgMjcsOCBtMyBkZSBnYXMgKElBUEcpIMOzIDI4LjMyODYxIG0zIChDYW5hZGEgRW5lcmd5IFJlZ3VsYXRvcikgIA0KY29udmVyc29yX01NQlRVbTNnYXNfcCA8LSBmdW5jdGlvbih4KSB7eCAvIDI4LjMyODYxfQ0KICANCiMjIG0zIGEgIE1NQlRVIGRlIGdhcw0KIyAxIG0zID0gMC4wMzUzIE1NIEJUVSAgKENhbmFkYSBFbmVyZ3kgUmVndWxhdG9yKQ0KIyBvdHJhIG9wY2nDs24gMSBtMyA9IDM0LjEyMSBNTSBCVFUgIChCUCkNCmNvbnZlcnNvcl9tM01NQlRVX3EgPC0gZnVuY3Rpb24oeCl7eCAqIDAuMDM1M30NCmNvbnZlcnNvcl9tM01NQlRVX3AgPC0gZnVuY3Rpb24oeCl7eCAvIDAuMDM1M30NCg0KIyMgbTMgYSAgTU1CVFUgKEFsdGVybmF0aXZhLCByZXZpc2FyKQ0KIyBjb252ZXJzb3JfbTNNTUJUVV9xIDwtIGZ1bmN0aW9uKHgpe3ggKiAxLzI3Ljh9DQojIGNvbnZlcnNvcl9tM01NQlRVX3AgPC0gZnVuY3Rpb24oeCl7eCAvIDEvMjcuOH0NCg0KIyMgQ29udmVyc2nDs24gYSBCRVAgZGVzZGUgZGlzdGludGFzIG1lZGlkYXMNCmNvbnZlcnNvcl9tM2JlcF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogNTg4M30NCmNvbnZlcnNvcl9NTUJUVWJlcF9xIDwtIGZ1bmN0aW9uKHgpIHt4ICogMC4xNzI0NTQ5Nn0gIyBCUA0KY29udmVyc29yX01NQlRVYmVwX3AgPC0gZnVuY3Rpb24oeCkge3ggLyAwLjE3MjQ1NDk2fQ0KY29udmVyc29yX2JlcE1NQlRVX3AgPC0gZnVuY3Rpb24oeCkge3ggLyA1Ljc5ODYxNX0NCmBgYA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIE90cmFzIGZ1bmNpb25lcw0KY2FtYmlvX3BvcmNlbnR1YWwgPC0gZnVuY3Rpb24oeCkge3gvbGFnKHgpIC0gMX0NCg0KZ2VuZXJhcl9pbmRpY2UgPC0gIGZ1bmN0aW9uKHNlcmllLGZlY2hhLCBmZWNoYV9iYXNlKXsNCiAgdmFsb3JfYmFzZSA8LSBzZXJpZVt3aGljaChmZWNoYT09ZmVjaGFfYmFzZSldDQogIGlmX2Vsc2Uoc2VyaWUgPT0gMCwgMCwgc2VyaWUvdmFsb3JfYmFzZSkNCn0NCg0KDQoNCnZhcmlhY2lvbl9pbnRlcmFudWFsIDwtIGZ1bmN0aW9uKHgpIHt4ICAtIGxhZyh4KX0NCg0KdGFzYV9jcmVjaW1pZW50byA8LSBmdW5jdGlvbih4KSB7KHggIC0gbGFnKHgpKS9sYWcoeCl9DQoNCg0KZ2VuZXJhcl9pbmRpY2UgPC0gIGZ1bmN0aW9uKHNlcmllLGZlY2hhLCBmZWNoYV9iYXNlKXsNCiAgdmFsb3JfYmFzZSA8LSBzZXJpZVt3aGljaChmZWNoYT09ZmVjaGFfYmFzZSldDQogIChzZXJpZS92YWxvcl9iYXNlKQ0KfQ0KDQoNCg0KIyBUYWJsYSBwYXJhIGNvbnZlcnRpciBsb3MgY2FtYmlvcyBkZSBtb25lZGENCmNvbnZlcnNvcl9wZXNvcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL3Bhc2UgZGUgbW9uZWRhLnhsc3giKSAlPiUgDQogICMgbXV0YXRlKCJtJG4iID0gYXMuZG91YmxlKGNvbnZlcnNvcl9wZXNvcyRgbSRuYCkpICU+JSANCiAgbXV0YXRlX2FsbCguLCBhcy5kb3VibGUpICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9IGMoIm1vbmVkYSBuYWNpb25hbCIsICJwZXNvcyBsZXkiLCAicGVzbyBhcmdlbnRpbm8iLCAiYXVzdHJhbCIsICJwZXNvcyIpKSAlPiUgDQogIGZpbHRlcihtb25lZGEgPT0gInBlc29zIikNCg0KYGBgDQoNCg0KDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KDQojIERhdG9zIGF1eGlsaWFyZXMNCiMjUmV2aXN0YSBkZSBQb2zDrXRpY2EgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ8OtYQ0KIyMgR0FTDQojcHJlY2lvIHRyYW5zZmVyZW5jaWEsIHJlZ2FsaWFzLCBjb21wZW5zYWNpb25lcywgZXRjIGEgbm92aWVtYnJlIGRlIGNhZGEgYcOxbw0KY3VhZHJvXzQuMSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDEpDQoNCiNwcmVjaW8gYm9saXZpYSB2cyBwcmVjaW9zIGludGVybm9zDQpjdWFkcm9fNC4zIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMykgJT4lDQogIHJlbmFtZSh1bmlkYWRfZ2FzID0gInVuaWRhZCBnYXMiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfZ2FzID0gInBlc29zIGRlIDE5NzAvMTAwMCBtMyIgKQ0KDQojcHJlY2lvIGFkcXVpc2ljacOzbiBkZWwgRXN0YWRvIHkgdGFyaWZhIG1lZGlhIGRlIGdhcyBkaXN0cmlidWlkbw0KY3VhZHJvXzQuNCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JldmlzdGFzIFBvbMOtdGljYXMgZGUgUHJlY2lvcyBkZSBsYSBFbmVyZ2lhIGVuIEFyZyAxOTcwLTE5ODgvUHJlY2lvcyBkZWwgZ2FzIG5hdHVyYWwgeSBkZXJpdmFkb3MgMTk3MCAtIDE5ODgueGxzeCIsIA0KICAgIHNraXAgPSAxLCBzaGVldCA9IDQpDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyMgQ1JVRE8NCg0KIyBQcmVjaW9zIHBvciBjdWVuY2ENCmN1YWRyb18yLjIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMCwgc2hlZXQgPSAyKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3MgZGUgMTk3MCIpDQoNCiNldm9sdWNpw7NuIGRlIHByZWNpb3MgcG9yIGN1ZW5jaWEgKGluZGljZXMgMTk3MCA9IDEwMCkNCmN1YWRyb18yLjMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMCwgc2hlZXQgPSAzKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIi4uLjEiKQ0KDQoNCiMgcHJlY2lvIHByb21lZGlvIHBhZ2FkbyBhIGNvbnRyYXRpc3RhcyBlbiBwZXNvcyB5IGRvbGFyZXMNCmN1YWRyb18yLjUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA1KQ0KDQojIHByZWNpb3MgcGFnYWRvcyBhIGNvbnRyYXRpc3RhcyB2cyBjb2JyYWRvcyBwb3IgcmVmaW5hZG9yYXMgcHJpdmFkYXMgKHByZWNpbyBjcnVkbyBuZXVxdWluYSkNCmN1YWRyb18yLjYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA2KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3NfZGVfMTk3MF9tMyIpDQoNCiMgdmFsb3JlcyB1bml0YXJpb3MgZGVsIHByb2R1Y3RvIGNvbXB1ZXN0byBhIG5pdmVsIHByb2R1Y3RvcmVzIHkgY29uc3VtaWRvcmVzDQpjdWFkcm9fMi43IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gNykNCg0KYGBgDQogDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIyBUQ1AgDQp0Y3BfYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvVENQL3RjcF9hbnVhbC54bHN4IiwgDQogICAgY29sX3R5cGVzID0gYygibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiKSkgJT4lIA0KICByZW5hbWUoYW5pbyA9IGZlY2hhKQ0KDQp0Y3BfYW51YWxfYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9UQ1AvdGNjX3RjcF9oaXN0b3JpY28ueGxzeCIpICU+JSANCiAgcmVuYW1lKHRjYyA9ICBgVENDIGV4cG9ydGFjaW9uZXNgLCBzb2JyZXZhbHVhY2lvbiA9IGBTb2JyZXZhbHVhY2nDs24gKFRDUC8gVENDKSAxOTUyLTE5NzI9MWAsDQogICAgICAgICB0Y3AgPSAiVENQIikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGNhc2Vfd2hlbihhbmlvID09IDQzMzEzIH4gMjAxOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGFuaW8pKSAlPiUgDQogIHNlbGVjdChhbmlvLCB0Y2MsIHRjcCwgc29icmV2YWx1YWNpb24pDQoNCiMgdGNfMzUwMCA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvVENQL2NvbTM1MDAueGxzIiwgc2tpcCA9IDMsIHNoZWV0ID0gMSkgJT4lIA0KIyAgIHNlbGVjdCgtIi4uLjMiKSAlPiUgDQojICAgbXV0YXRlKGFuaW8gPSB5ZWFyKEZlY2hhKSkgJT4lIA0KIyAgIGdyb3VwX2J5KGFuaW8pICU+JSANCiMgICBzdW1tYXJpc2UodGNjX2F2ZyA9IG1lYW4oYFRpcG8gZGUgQ2FtYmlvIGRlIFJlZmVyZW5jaWEgLSBlbiBQZXNvcyAtIHBvciBEw7NsYXJgKSkNCiMgd3JpdGUuY3N2KHRjXzM1MDAsICJyZXN1bHRhZG9zL2F1eGlsaWFyZXMvdGNfMzUwMC5jc3YiKQ0KDQp0Y2NfZGljXzYzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL1RDUC90Y2NfZGljXzYzLnhsc3giKQ0KDQp0Y2NfbW9uZWRhX29yaWdpbmFsIDwtICB0Y2NfZGljXzYzICU+JSANCiAgc2VsZWN0KC11c2RfZGljKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYyApKSAlPiUgDQogIG11dGF0ZShtb25lZGEgPSBjYXNlX3doZW4oYW5pbyA9PSAxOTg0IH4gIiRhcmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtb25lZGEpLA0KICAgICAgICAgIHRjY19tb25lZGEgPSBjYXNlX3doZW4oICNob21vZ2VuaXphbW9zIGxvcyBjYW1iaW9zIGRlIG1vbmVkYQ0KICAgICAgICAgICAgICAgICBtb25lZGEgPT0gIm0kbiIgfiB0Y2MqY29udmVyc29yX3Blc29zJGBtJG5gICwNCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICIkbGV5IiB+IHRjYypjb252ZXJzb3JfcGVzb3MkYCRMZXlgLCANCiAgICAgICAgICAgICAgICAgbW9uZWRhID09ICIkYXJnIiB+IHRjYypjb252ZXJzb3JfcGVzb3MkYCRhYCwgDQogICAgICAgICAgICAgICAgIG1vbmVkYSA9PSAiQSIgfiB0Y2MqY29udmVyc29yX3Blc29zJEEsDQogICAgICAgICAgICAgICAgIFQgfiB0Y2MpICkNCnRjY19tb25lZGFfb3JpZ2luYWwgIA0KYGBgDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIElQQw0KaXBjIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL2luZGljZXMvaXBjX21lbnN1YWxfMTk2M18yMDE4Lnhsc3giKSAlPiUgDQogIG11dGF0ZShhbmlvID0gem9vOjpuYS5sb2NmKGFuaW8pKSAlPiUgDQogIHJlbmFtZShpcGNfMDcwMyA9IGBCYXNlIDcvMjAwMyA9IDFgKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlKGFuaW8sIG1lcywgc2VwID0gIi0iKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzICwgZXZlcnl0aGluZyguKSkNCg0KI2VzdGUgZXN0w6EgbWFsICANCiMgaXBjX3ZhcmlhY2lvbiA8LSAgaXBjICAlPiUgDQojICAgZmlsdGVyKG1lcyA9PSAxKSAlPiUgDQojICAgbXV0YXRlKGlwY192YXIgPSBjYW1iaW9fcG9yY2VudHVhbChpcGNfMDcwMyksDQojICAgICAgICAgIGlwY192YXI9IGNhc2Vfd2hlbihpcy5uYShpcGNfdmFyKSB+IDEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gaXBjX3ZhciksDQojICAgICAgICAgICBpcGNfMDE2MiA9IGNhc2Vfd2hlbihhbmlvID09IDE5NjIgfiAxKSwNCiMgICAgICAgICAgaXBjXzAxNjIgPSBsYWcoaXBjXzAxNjIpK2xhZyhpcGNfMDE2MikqIGlwY192YXIpDQojICAgICAgICAgIA0KICAgICAgICAgIyBpcGNfMDE2MiA9IGxhZyhpcGNfMDE2MikgKyAobGFnKGlwY18wMTYyKSogaXBjX3ZhcikpDQogICAgICAgICAjIGlwY18wMTYyID0gY2FzZV93aGVuKCBpcy5uYShpcGNfMDE2MikgfiBsYWcoaXBjXzAxNjIpICsgbGFnKGlwY18wMTYyKSppcGNfdmFyICkpDQoNCg0KaXBjX3Byb21lZGlvIDwtIGlwYyAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaXBjXzAzID0gbWVhbihpcGNfMDcwMykpICU+JSANCiAgbXV0YXRlKGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUoYW5pbyAsIG9yZGVycyA9ICJ5IikpLCANCiAgICAgICAgIGlwY183MCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjE5NzAtMDEtMDEiKSwNCiAgICAgICAgIGlwY18xOCA9IGdlbmVyYXJfaW5kaWNlKHNlcmllID0gaXBjXzAzLCAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGE9IGZlY2hhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYV9iYXNlID0gIjIwMTgtMDEtMDEiKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLikpDQoNCndyaXRlLmNzdihpcGNfcHJvbWVkaW8sIGZpbGUgPSAiQzovQXJjaGl2b3MvRGF0b3MvaW5kaWNlcy9pcGNfcHJvbWVkaW8uY3N2IikNCg0KIyBpcGNfNzAgPC0gaXBjX3ZhcmlhY2lvbiAlPiUgDQojICAgc2VsZWN0KGZlY2hhLCBpcGNfMDE3MCkgJT4lIA0KIyAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KIyAgICAgICAgICAgICAgIHNlbGVjdChmZWNoYSwgaXBjXzcwKSkNCg0KIyBJUElNIGJhc2UgMTk5MyA9IDEwMA0KIyDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYWwgcG9yIG1heW9yIChJUElNKQ0KIyDDjW5kaWNlIGRlIHByZWNpb3MgaW50ZXJub3MgYsOhc2ljb3MgYWwgcG9yIG1heW9yIChJUElCKQ0KIyDDjW5kaWNlIGRlIHByZWNpb3MgYsOhc2ljb3MgZGVsIHByb2R1Y3RvciAoSVBQKQ0Kc2lwbV9zZXJpZTU2Xzk1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0lOREVDL0lQSU0vc2lwbS1zZXJpZTU2LTk1LnhscyIsDQogICAgc2tpcCA9IDYpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBtZXMsDQogICAgICAgICBpcGltX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uMiAsDQogICAgICAgICBpcGltX25pdmVsX25hYyA9IG5hY2lvbmFsZXMuLi4zLA0KICAgICAgICAgaXBpbV9uaXZlbF9pbXBvID0gSW1wb3J0YWRvcywNCiAgICAgICAgIGlwaWJfbml2ZWxfZ3JhbCA9IGdlbmVyYWwuLi41ICwNCiAgICAgICAgIGlwaWJfbml2ZWxfbmFjID0gbmFjaW9uYWxlcy4uLjYsDQogICAgICAgICBpcGliX25pdmVsX2ltcG8gPSBpbXBvcnRhZG9zLA0KICAgICAgICAgaXBwX25pdmVsX2dyYWwgPSBnZW5lcmFsLi4uOCkgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoICIxOSIsIGFuaW8pKSAlPiUgDQogIG11dGF0ZShhbmlvID0gYXMuZG91YmxlKGFuaW8pKQ0KDQppcGltX2Jhc2U5NCA8LSBzaXBtX3NlcmllNTZfOTUgJT4lIG11dGF0ZShpcGltX25pdmVsX2dyYWxfOTQgPSBnZW5lcmFyX2luZGljZShpcGltX25pdmVsX2dyYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDE5OTQpKSAlPiUgDQogIHNlbGVjdChhbmlvLCBpcGltX25pdmVsX2dyYWwsIGlwaW1fbml2ZWxfZ3JhbF85NCkNCg0KIyBHYW5hbmNpYSB5IHBiaSBwZXNvcyBjb3JyaWVudGVzIChmdWVudGU6IEpJQy9FTSBjb250aW51YWNpb24gSklDKQ0KZ2FuYW5jaWFfeV9wYmkgPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZ2FuYW5jaWEgeSBwYmkueGxzeCIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQpgYGANCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KIyBFc3RpbWFjaW9uIGRlIG90cm9zIGF1dG9yZXMNCiMgKipFc3RpbWFjacOzbiBKSyoqDQpyZW50YV9oaWRyb2NhcmJ1cm9zX2prIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3JlbnRhX2hpZHJvY2FyYnVyb3NfamsueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgZmlsdGVyKGluZGljZV90aWVtcG8gPD0gMjAxOSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUocHJlY2lvX21lX2dhcyA9IGBHYXMgbmF0dXJhbCBtZXJjYWRvIGV4dGVybm9gLA0KICAgICAgICAgcHJlY2lvX21pX2dhcyA9IGBwcmVjaW8gaW50ZXJubyBnYXMgbmF0dXJhbF9wZXNvc2AsDQogICAgICAgICBwcmVjaW9fbWVfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gZXh0ZXJub2AsDQogICAgICAgICBwcmVjaW9fbWlfY3J1ZG8gPSBgUHJlY2lvIGNydWRvIG1lcmNhZG8gaW50ZXJub2AsDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfdXNkID0gYEdhcyBOYXR1cmFsLiBQcmVjaW8gVmVudGEgQm9saXZpYSBhIEFyZ2VudGluYS4uLjI0YCwgDQogICAgICAgICBwcmVjaW9fYm9saXZpYV9nYXNfcGVzb3MgPSBgR2FzIE5hdHVyYWwuIFByZWNpbyBWZW50YSBCb2xpdmlhIGEgQXJnZW50aW5hLi4uMjVgLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2NydWRvID1gUmVudGEgcG9yIHZlbnRhIGNydWRvIGVuIGVsIG1lcmNhZG8gaW50ZXJubyBwb3IgZGViYWpvIC8gYXJyaWJhIHByZWNpbyBpbnRlcm5hY2lvbmFsYCwNCiAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb19nYXMgPSAnUmVudGEgcG9yIHZlbnRhIGdhcyBlbiBlbCBtZXJjYWRvIGludGVybm8gcG9yIGRlYmFqbyAvIGFycmliYSBwcmVjaW8gaW50ZXJuYWNpb25hbCcsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9ICdSZW50YSBjcnVkbyBwb3IgZXhwb3J0YWNpb25lcyBhIHBlc28gc29icmV2YWx1YWRvJywNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9ICdSZW50YSBnYXMgcG9yIGV4cG9ydGFjaW9uZXMnLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSAiUmV0ZW5jaW9uZXMiLA0KICAgICAgICAgcmVnYWxpYXMgPSBgUmVnYWxpYXMgdG90YWxgLA0KICAgICAgICAgcmVudGFfdG90YWwgPSAnU1VNQSByZW50YSBvdHJvcyAoc2luIGltcG9ydGFjaW9uZXMgbmkgcmV0ZW5jaW9uZXMpJykgJT4lIA0KICBtdXRhdGUodW5pZGFkX2dhcyA9ICJNTUJUVSIsDQogICAgICAgICB1bmlkYWRfY3J1ZG8gPSAiQmFycmlsZXMiLA0KICAgICAgICAgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvID0gaW5kaWNlX3RpZW1wbywgdW5pZGFkX2dhcywgdW5pZGFkX2NydWRvLCB1bmlkYWRfcmVudGEsDQogICAgICAgICBwcm9kX3BldGNydSwgZXhwb19jcnVkbywgY3J1ZG9faW50ZXJubywNCiAgICAgICAgIHByb2RfZ2FzbmF0LCBleHBvX2dhcywgZ2FzX2ludGVybm8sDQogICAgICAgICBwcmVjaW9fbWVfZ2FzICwgcHJlY2lvX21pX2dhcyAsIHByZWNpb19tZV9jcnVkbywgcHJlY2lvX21pX2NydWRvLCANCiAgICAgICAgIHByZWNpb19ib2xpdmlhX2dhc191c2QgLCAgcHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zICwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8gLCByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fZ2FzICwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICwgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICwNCiAgICAgICAgIHJldGVuY2lvbmVzLCByZWdhbGlhcywgDQogICAgICAgICBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV90b3RhbCkgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByb2RfcGV0Y3J1IiwgImV4cG9fY3J1ZG8iLCAiY3J1ZG9faW50ZXJubyIpLCANCiAgICAgICAgICAgIC5mdW5zID0gY29udmVyc29yX20zYmJsX3EpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX21pX2NydWRvIiwgInByZWNpb19tZV9jcnVkbyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcCkgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcm9kX2dhc25hdCIsICJleHBvX2dhcyIsICJnYXNfaW50ZXJubyIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9xKSAlPiUgDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19taV9nYXMiLCAicHJlY2lvX2JvbGl2aWFfZ2FzX3Blc29zIiksDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM01NQlRVX3ApDQoNCiAgDQpyZW50YV9wcmVjaW9fZXhwb19jcnVkb19qayA8LSByZW50YV9oaWRyb2NhcmJ1cm9zX2prICU+JSANCiAgc2VsZWN0KGFuaW8sIHByb2RfcGV0Y3J1LCBleHBvX2NydWRvLCBjcnVkb19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9jcnVkbywgcHJlY2lvX21lX2NydWRvLCBUQ0MsIFRDUCwgDQogICAgICAgICByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9fY3J1ZG8sIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICkNCg0KDQpyZW50YV9wcmVjaW9fZXhwb19nYXNfamsgPC0gcmVudGFfaGlkcm9jYXJidXJvc19qayAlPiUgDQogIHNlbGVjdChhbmlvLCBwcm9kX2dhc25hdCwgZXhwb19nYXMsIGdhc19pbnRlcm5vLCANCiAgICAgICAgIHByZWNpb19taV9nYXMsIHByZWNpb19ib2xpdmlhX2dhc19wZXNvcywgVENDLCBUQ1AsIA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvX2dhcywgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzICkNCg0KDQojRXN0aW1hY2nDs24gQmlsbCB5IEZhcmZhcm8gUnVpeg0KcmVudGFfaGlkcm9jYXJidXJvc19mciA8LSByZWFkX2V4Y2VsKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZW50YV9oaWRyb2NhcmJ1cm9zX0ZSLnhsc3giICkgJT4lDQogIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9ICJSZWdhbMOtYXMiLA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPSBSZXRlbmNpb25lcywNCiAgICAgICAgIGV4cG9fdGMgPSAiTWVkaWFudGUgc29icmV2YWx1YWNpw7NuIHBhcmEgZXhwb3J0IiwNCiAgICAgICAgIGRpZl9wcmVjaW9zID0gIk1lZGlhbnRlIGRpZmVyZW5jaWEgcHJlY2lvIGludGVybm8gY29uIGludGVybmFjIikgJT4lDQogIGdyb3VwX2J5KGFuaW8gLCBpcGNfMDgpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eCAvIDEwXjN9KSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHJlZ2FsaWFzID1yZWdhbGlhcyAqIGlwY18wOCAvaXBjXzE4LA0KICAgICAgICAgcmV0ZW5jaW9uZXMgPXJldGVuY2lvbmVzICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICBleHBvX3RjID1leHBvX3RjICogaXBjXzA4IC9pcGNfMTgsDQogICAgICAgICBkaWZfcHJlY2lvcyA9ZGlmX3ByZWNpb3MgKiBpcGNfMDggL2lwY18xOCwNCiAgICAgICAgIHJlbnRhX3RvdGFsID0gcmVnYWxpYXMrIHJldGVuY2lvbmVzKyBleHBvX3RjKyBkaWZfcHJlY2lvcywNCiAgICAgICAgIHVuaWRhZCA9ICJtaWxsb25lcyBkZSBwZXNvcyAyMDE4IikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWlwY18wOCkgDQpyZW50YV9oaWRyb2NhcmJ1cm9zX2ZyDQoNCiNvdHJvcyBhdXRvcmVzDQpyZW50YV9hdXRvcmVzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gY2FsY3VsbyByZW50YSBvdHJvcy9yZW50YV9hdXRvcmVzLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkNCg0KDQpgYGANCg0KDQojIFZhcmlhYmxlcw0KDQojIyBQcm9kdWNjacOzbg0KDQpGdWVudGVzOiANCg0KKiBbTWluaXN0ZXJpbyBkZSBIYWNpZW5kYSwgSW5mb3JtZXMNClNlY3RvcmlhbGVzXShodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL2Vjb25vbWlhL3BvbGl0aWNhZWNvbm9taWNhL3JlZ2lvbmFseXNlY3RvcmlhbC9pbmZvcm1lc3Byb2R1Y3Rpdm9zKSAoMTk5OC1ob3kpLiANCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gUmVnYWxpYXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9yZWdhbGlhcy1kZS1wZXRyb2xlby1jcnVkby1nYXMtbmF0dXJhbC1nbHAtZ2Fzb2xpbmEteS1jb25kZW5zYWRvKSAoMTk5OC1ob3kpDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAtIFNFU0NPIERvd25zdHJlYW1dKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXRhYmxhcy1kaW5hbWljYXMpKDE5OTMtaG95KQ0KKiBbQW51YXJpbyBkZSBjb21idXN0aWJsZXNdKGh0dHA6Ly9kYXRvcy5taW5lbS5nb2IuYXIvZGF0YXNldC9hbnVhcmlvcy1kZS1jb21idXN0aWJsZXMtMTk1MC0xOTk5KSAoMTkxMS0xOTkyKQ0KKiBLb3p1bGogeSBQaXN0b25lc2kuIFJldmlzdGEgIGRlbCBJbnN0aXR1dG8gZGUgRWNvbm9tw61hIEVuZXJnw6l0aWNhIChJREVFKSAtIEZ1bmRhY2nDs24gQmFyaWxvY2hlICAoMTk3MCAtIDE5ODgpDQoqIFtFSUFdKGh0dHBzOi8vd3d3LmVpYS5nb3YvaW50ZXJuYXRpb25hbC9kYXRhL2NvdW50cnkvQVJHL3BldHJvbGV1bS1hbmQtb3RoZXItbGlxdWlkcy9hbm51YWwtcGV0cm9sZXVtLWFuZC1vdGhlci1saXF1aWRzLXByb2R1Y3Rpb24/cGQ9NSZwPTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDB2ZyZ1PTAmZj1BJnY9bWFwYnViYmxlJmE9LSZpPW5vbmUmdm89dmFsdWUmJnQ9QyZnPW5vbmUmbD0yNDktLTYmcz05NDY5NDQwMDAwMCZlPTE1NDYzMDA4MDAwMDApICgxOTgwIC0gMjAxOSkNCg0KIyMjIFByb2R1Y2Npw7NuIGRlIENydWRvDQoNCg0KTGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIGRlIGxhcmdvIHBsYXpvIHByb3ZpZW5lIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgZGUgbGEgY3VhbCBjb250YW1vcyBkYXRvcyBkZXNkZSAxOTExIGhhc3RhIDE5OTIuIFN1cyB2YWxvcmVzIHBhcmEgZWwgcGVyw61vZG8gMTk4MC0xOTkyIGNvaW5jaWRlbiBjb24gbG9zIGRlIEVJQSwgcG9yIGxvIGN1YWwgcHVlZGVuIHVzYXJzZSBjb21vIGZ1ZW50ZXMgYWx0ZXJuYXRpdmFzLiBBc2ltaXNtbywgbGEgZXZvbHVjacOzbiBkZSBTRVNDTyBlcyBzaW1pbGFyIGEgbGEgZGUgRUlBLCBzYWx2byBwb3IgcGVxdWXDsWFzIGRpdmVyZ2VuY2lhcyBlbnRyZSAyMDA4IHkgMjAxMy4gTGEgc2VyaWUgZGUgUmVnYWzDrWFzIHByZXNlbnRhIHVuIG5pdmVsIG1lbm9yIHF1ZSBsYXMgYW50ZXJpb3JlcyBkZWJpZG8gYSBsYXMgZGVkdWNjaW9uZXMgZGUgcHJvZHVjY2nDs24gcXVlIHJlYWxpemFuIGxhcyBlbXByZXNhcyBwYXJhIHBhZ2FyIHVuIG1lbm9yIG5pdmVsIGRlIFJlZ2Fsw61hcyBoYWNpYSBsYXMgcHJvdmluY2lhcyBkb25kZSByZWFsaXphbiBsYSBwcm9kdWNjacOzbi4gUG9yIMO6bHRpbW8sIGxhIHNlcmllIGRlbCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSBjb2luY2lkZSBjb24gUmVnYWzDrWFzIGVuIHN1cyBwcmltZXJvcyBhw7FvcywgbHVlZ28gcHJlc2VudGEgdW4gbml2ZWwgaW50ZXJtZWRpbyBlbnRyZSBSZWdhbMOtYXMgeSBTRVNDTyB5IGEgcGFydGlyIGRlIDIwMDkgdG9tYSBhIFNFU0NPIGNvbW8gZnVlbnRlLiBTYWx2byBlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgZWwgcmVzdG8gZGUgbGFzIHNlcmllcyBwcmVzZW50YW4gZGF0b3MgaGFzdGEgbG9zIMO6bHRpbW9zIGHDsW9zLiBQb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBjb24gbGEgcXVlIHNlIHJlYWxpemFyw6FuIGxvcyBjw6FsY3Vsb3MgZXMgZWwgc2lndWllbnRlOg0KDQoqIENyaXRlcmlvIGRlIGPDs21wdXRvIHBhcmEgcHJvZHVjaWPDs24gZGUgY3J1ZG86IA0KICArIDE5MTEgYSAxOTkyOiBBbnVhcmlvIGRlIGNvbWJ1c3RpYmxlcyANCiAgKyAxOTkzIC0gYWN0dWFsaWRhZDogU0VTQ08gRG93bnN0cmVhbQ0KDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgUFJPQ0VTQVIgRVNUQSBCQVNFDQptZWNvbl9oaWRyb2NhcmJ1cm9zX2RmIDwtICByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9oaWRyb2NhcmJ1cm9zLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoaW5kaWNlX3RpZW1wbyA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpKSwgDQogICAgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIklTTy04ODU5LTEiKSkNCnVuaXF1ZShtZWNvbl9oaWRyb2NhcmJ1cm9zX2RmJGluZGljYWRvcikNCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0FudWFyaW8gZGUgY29tYnVzdGlibGVzDQpwcm9kX2FudWFyaW8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qcm9kdWNjaW9uL1Byb2R1Y2Npb25fRGVzZGVfMTkxMSAtIGNvcGlhLnhscyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsIGNydWRvX2FudWFyaW9fTW0zID0gIlBFVFJPTEVPIChNbTMpIiwgDQogIGdhc19oID0gYEdBUyBOQVRVUkFMIChNaWxsLiBtMylgLCBjYXJib25faCA9IGBDQVJCT04gKE1UbikgKCopYCkgJT4lIA0KICBtdXRhdGUoZ2FzX2FudWFyaW9fTU1tMyAgID0gYXMuZG91YmxlKGdhc19oKSwgDQogICAgICAgICBjYXJib25fYW51YXJpb19NdG4gICA9IGFzLmRvdWJsZShjYXJib25faCksDQogICAgICAgICBjcnVkb19hbnVhcmlvID0gY3J1ZG9fYW51YXJpb19NbTMgKiAxMDAwKSAlPiUgDQogIHNlbGVjdChhbmlvLCBjcnVkb19hbnVhcmlvLCBnYXNfYW51YXJpb19NTW0zLCBjYXJib25fYW51YXJpb19NdG4gKQ0KDQojIFJldmlzdGEgSURFRQ0KIyBQcm9kdWNjacOzbiBjcnVkbyBwb3IgYWRtaW5pc3RyYWNpw7NuIHkgY29udHJhdG9zDQpjdWFkcm9fMi4xIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBwZXRyb2xlbyBjcnVkbyB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OS54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMSkgJT4lIA0KICByZW5hbWUodW5pZGFkID0gIi4uLjUiKQ0KDQojYmFzZSBNaW5pc3RlcmlvIGRlIEhhY2llbmRhDQpoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gPC0gIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2RhdGFzZXRzIHZpZWpvcy9oaWRyb2NhcmJ1cm9zLmNzdiIsIA0KICAgIGxvY2FsZSA9IGxvY2FsZShkYXRlX25hbWVzID0gImVzIiwgZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKSAlPiUgDQogIG11dGF0ZShmZWNoYSA9IGFzLkRhdGUobHVicmlkYXRlOjpwYXJzZV9kYXRlX3RpbWUoaW5kaWNlX3RpZW1wbywgb3JkZXJzID0gImRteSIpKSkgJT4lIA0KICBzZWxlY3QoZmVjaGEsIGV2ZXJ5dGhpbmcoLiksIC1jKDE6MywgZnVlbnRlLCBpbmRpY2VfdGllbXBvLGFsY2FuY2VfaWQpKQ0KDQojbGlzdGEgY29uIGluZGljYWRvcmVzDQpsaXN0YV9maWx0cm8gPC0gdW5pcXVlKGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiRpbmRpY2Fkb3IpDQoNCg0KcHJvZF9tZWNvbl9jcnVkbyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoIGluZGljYWRvciA9PSBsaXN0YV9maWx0cm9bM10sDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJQZXRyw7NsZW8gY3J1ZG8iLA0KICAgICAgICAgZnJlY3VlbmNpYV9ub21icmUgPT0gIk1lbnN1YWwiKSAlPiUgIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUsIGluZGljYWRvciwgdW5pZGFkX2RlX21lZGlkYSkgJT4lIA0KICBzdW1tYXJpc2UoY3J1ZG9fbWVjb24gPSBzdW0odmFsb3IpKQ0KDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2NydWRvIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJvZHVjY2lvbl9jcnVkb19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJtMyIsDQogICAgICAgICBhbmlvID16b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBNRVMsIGFuaW8sIHVuaWRhZCwgIlRPVEFMIENVRU5DQSIsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgcmVuYW1lKHByb2RfY3J1ZG9fbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIHN1bW1hcmlzZShjcnVkb19yZWdhbGlhcyA9IHN1bShwcm9kX2NydWRvX20zKSkNCg0KI0Jhc2UgU0VTQ08gLmNzdiAgKFByZSAyMDA5KQ0KcHJvZF9zZXNjb19jcnVkb19hIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL3Byb2R1Y2Npbi1kZS1wZXRybGVvLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgJT4lDQogIHNlbGVjdChhbmlvLCBtZXMsaWRjb25jZXB0bywgY29uY2VwdG8sIENhbnRpZGFkICkgJT4lDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKSAlPiUNCiAgIyBmaWx0ZXIoIWlkY29uY2VwdG8gJWluJSBjKDQsIDUsIDcsIDgsIDkJKSkgJT4lDQogIGZpbHRlcihjb25jZXB0byAlaW4lIGMoIlByb2R1Y2Npw7NuIFByaW1hcmlhIChtMykiLCJQcm9kdWNjacOzbiBTZWN1bmRhcmlhIChtMykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWNjacOzbiBwb3IgUmVjdXBlcmFjacOzbiBBaXNpc3RpZGEgKG0zKSIpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQojIEJhc2UgU0VTQ08gKFBvc3QgMjAwOSkNCnByb2Rfc2VzY29fY3J1ZG9fYiA8LSByZWFkX2NzdigNCiAgIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vcHJvZHVjY2luLWRlLXBldHJsZW8tcG9yLXlhY2ltaWVudG8uY3N2IikgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLGlkY29uY2VwdG8sIGNvbmNlcHRvLCBjYW50aWRhZCApICU+JQ0KICAjIGZpbHRlcighaWRjb25jZXB0byAlaW4lIGMoNCwgNSwgNywgOCwgOQkpKSAlPiUNCiAgIyBmaWx0ZXIoaWRjb25jZXB0byAlaW4lIGMoMSwyLDMsIDYpKSU+JQ0KICAgIGZpbHRlcihjb25jZXB0byAlaW4lIGMoIlByb2R1Y2Npw7NuIFByaW1hcmlhIChtMykiLCJQcm9kdWNjacOzbiBTZWN1bmRhcmlhIChtMykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9kdWNjacOzbiBwb3IgUmVjdXBlcmFjacOzbiBBaXNpc3RpZGEgKG0zKSIpKSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShjcnVkb19zZXNjbyA9IHN1bShjYW50aWRhZCwgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZSh1bmlkYWQgPSAibTMiKQ0KDQpwcm9kX3Nlc2NvX2NydWRvIDwtIHByb2Rfc2VzY29fY3J1ZG9fYSAlPiUgDQogIGJpbmRfcm93cyhwcm9kX3Nlc2NvX2NydWRvX2IpDQoNCiMgU0VTQ08gZGVzZGUgMTk1MA0KICANCnByb2Rfc2VjX2VuZXJnaWEgPC0gcmVhZC5jc3YoICIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9zZXJpZS1wcm9kdWNjaW9uLXBldHJvbGVvLXRvdGFsLXBhaXMtZGVzZGUtMTk1MC5jc3YiKSAlPiUgDQogIG11dGF0ZShwcm9kdWNjaW9uX3BldHJvbGVvID0gcHJvZHVjY2lvbl9wZXRyb2xlbyoxMDAwLA0KICAgICAgICAgdW5pZGFkID0gIm0zIikgJT4lIA0KICByZW5hbWUoY3J1ZG9fc2VjX2VuZXJnaWEgPSBwcm9kdWNjaW9uX3BldHJvbGVvKSANCg0KDQojRUlBDQoNCiN1bmlkYWQgb3JpZ2luYWwgPSBiYXJyZWxzIHBlciBkYXkNCg0KIyBUb3RhbCBQZXRyb2xldW0gYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiA9IENydWRlIG9pbCwgTkdQTCwgYW5kIG90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbiArIFJlZmluZXJ5IHByb2Nlc3NpbmcgZ2Fpbg0KIyBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIHByb2R1Y3Rpb24gPSBDcnVkZSBvaWwgaW5jbHVkaW5nIGxlYXNlIGNvbmRlbnNhdGUgcHJvZHVjdGlvbiArIE5hdHVyYWwgZ2FzIHBsYW50IGxpcXVpZHMgcHJvZHVjdGlvbiArIE90aGVyIGxpcXVpZHMgcHJvZHVjdGlvbg0KDQpwcm9kX2VpYV9jcnVkbyA8LSAgcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL29pbF9wcm9kdWN0aW9uX2FyZy5jc3YiLCANCiAgICB0cmltX3dzID0gRkFMU0UsIHNraXAgPSAxKSAlPiUgDQogIGZpbHRlcighaXMubmEoQVBJKSkgJT4lIA0KICBzZWxlY3QoLUFQSSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIHNwcmVhZCguLA0KICAgICAgICAga2V5ID0gWDIsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9vaWxfYW5kX290aGVyID0gYCAgICAgICAgVG90YWwgcGV0cm9sZXVtIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICBjcnVkZV9vaWxfY29uZGVuc2F0ZSA9IGAgICAgICAgICAgICAgICAgQ3J1ZGUgb2lsIGluY2x1ZGluZyBsZWFzZSBjb25kZW5zYXRlIChNYi9kKWAsDQogICAgICAgICBuYXR1cmFsX2dhcyA9IGAgICAgICAgICAgICAgICAgTkdQTCAoTWIvZClgLA0KICAgICAgICAgb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICAgICAgT3RoZXIgbGlxdWlkcyAoTWIvZClgLA0KICAgICAgICAgY3J1ZGVfb2lsX25ncGxfb3RoZXJfbGlxdWlkcyA9IGAgICAgICAgICAgICBDcnVkZSBvaWwsIE5HUEwsIGFuZCBvdGhlciBsaXF1aWRzIChNYi9kKWAsDQogICAgICAgICByZWZpbmVyeV9wcm9jZXNzaW5nX2dhaW4gPSBgICAgICAgICAgICAgUmVmaW5lcnkgcHJvY2Vzc2luZyBnYWluIChNYi9kKWApICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gKGMoImNydWRlX29pbF9jb25kZW5zYXRlIiwgIm5hdHVyYWxfZ2FzIiwgIm90aGVyX2xpcXVpZHMiLCANCiAgICAgICAgICAgICAgICAgICJjcnVkZV9vaWxfbmdwbF9vdGhlcl9saXF1aWRzIiwgInJlZmluZXJ5X3Byb2Nlc3NpbmdfZ2FpbiIgICwidG90YWxfb2lsX2FuZF9vdGhlciIpKSwNCiAgICAuZnVucyA9IGZ1bmN0aW9uKHgpIHt4ICogMzY1ICogMTAwMH0pICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojRUlBIGFsbCBkYXRhDQplaWFfYWxsX2RhdGEgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL2FyZ2VudGluYS9JTlQtRXhwb3J0LTA5LTE3LTIwMjBfMTEtMTUtMTYuY3N2IiwgDQogICAgc2tpcCA9IDEpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2NydWRvIDwtICBwcm9kX3JlZ2FsaWFzX2NydWRvICU+JSANCiAgbGVmdF9qb2luKHByb2RfbWVjb25fY3J1ZG8gICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX21lY29uKSkgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGNydWRvX3JlZ2FsaWFzLCBjcnVkb19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19jcnVkbykgJT4lIA0KICBmdWxsX2pvaW4ocHJvZF9hbnVhcmlvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNydWRvX2FudWFyaW8pICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJtMyIpKSAlPiUgDQogIGxlZnRfam9pbihwcm9kX3NlY19lbmVyZ2lhLCBieSA9IGMoImFuaW8iLCAidW5pZGFkIikpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gIGNydWRvX3JlZ2FsaWFzL2NydWRvX21lY29uLTEpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYyggICAiY3J1ZG9fcmVnYWxpYXMiICwiY3J1ZG9fbWVjb24iLCAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiY3J1ZG9fc2VzY28iLCAgICAiY3J1ZG9fYW51YXJpbyIsICJjcnVkb19zZWNfZW5lcmdpYSIgKSwgDQogICAgICAgICAgICAuZnVucyA9IGNvbnZlcnNvcl9tM2JibF9xKSAlPiUgIA0KICBsZWZ0X2pvaW4ocHJvZF9laWFfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgY3J1ZG9fZWlhID0gY3J1ZGVfb2lsX2NvbmRlbnNhdGUpKSAlPiUgDQogICBtdXRhdGUocHJvZF9jcnVkbyA9ICBjYXNlX3doZW4oYW5pbyA8IDE5NTAgfiBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAxOTUwOjIwMTUgfmNydWRvX3NlY19lbmVyZ2lhICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDIwMTUgfiBjcnVkb19zZXNjbyApLA0KICAgICAgICAgIHVuaWRhZCA9ICJiYXJyaWxlcyIsIA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBjcnVkbyBzZWfDum4gZGlzdGludGFzIGZ1ZW50ZXMiKSAgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzZWxlY3QoYW5pbywgdmFyaWFibGUsIHVuaWRhZCwgcHJvZF9jcnVkbywgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBjcnVkb19yZWdhbGlhcywNCiAgICAgICAgIG1lY29uID0gY3J1ZG9fbWVjb24sDQogICAgICAgICBzZXNjbyA9IGNydWRvX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPSBjcnVkb19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gY3J1ZG9fZWlhKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRlLmNzdihwcm9kX21lcmdlX2NydWRvLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9jcnVkby5jc3YiKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByb2RfbWVyZ2VfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2NydWRvLnhsc3giKQ0KDQojZGlmZXJlbmNpYSBwcm9tZWRpbyBkZWwgNiUgZW50cmUgbGFzIGJhc2VzIChlcyBtYXlvciBsYSBkZSBtZWNvbikNCiMgc3VtbWFyeShwcm9kX21lcmdlX2NydWRvKQ0KDQoNCiNFeGlzdGVuY2lhcw0KZXhpc3RlbmNpYXNfcGV0cm9sZW8gPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhpc3RlbmNpYXNfY3J1ZG8ueGxzeCIpICU+JQ0KICBmaWx0ZXIoIShpcy5uYShleGlzdGVuY2lhcyApKSkgJT4lIA0KICByZW5hbWUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBleGlzdGVuY2lhcykgJT4lIA0KICBtdXRhdGUoZXhpc3RlbmNpYXNfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShleGlzdGVuY2lhc19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKQ0KDQojIHBsb3QoZXhpc3RlbmNpYXNfcGV0cm9sZW8kYW5pbywgZXhpc3RlbmNpYXNfcGV0cm9sZW8kZXhpc3RlbmNpYXNfY3J1ZG8pDQoNCmBgYA0KDQo8YnI+DQoqKlRhYmxhIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICBzZWxlY3QoLXByb2RfY3J1ZG8pDQogDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90bHkocHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIG11dGF0ZShyZWdhbGlhcyA9IGNhc2Vfd2hlbihyZWdhbGlhcyA9PSAwIH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXMpKSAlPiUNCiAgICBzZWxlY3QoLXByb2RfY3J1ZG8pICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvciwgNDpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDEuIFByb2R1Y2Npw7NuIGRlIHBldHLDs2xlbyBjcnVkby4NCiAgICAgICAgQXJnZW50aW5hICgxOTExIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgQmFycmlsZXMiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgRUlBLCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSwgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzIHkgU0VTQ08pIikrDQogICMgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbih4KSBmb3JtYXQoeCwgYmlnLm1hcmsgPSAiLiIsIHNjaWVudGlmaWMgPSBGQUxTRSkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjp1bml0X2Zvcm1hdCh1bml0ID0iIiwgc2NhbGUgPSAxZS02KSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgDQpgYGANCg0KDQoNCiMjIyBQcm9kdWNjacOzbiBkZSBHYXMgTmF0dXJhbA0KDQpBbCBpZ3VhbCBxdWUgZW4gbGEgcHJvZHVjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvLCBsYSBzZXJpZSBkZSBsYXJnbyBwbGF6byBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcHJvdmllbmUgZGVsIEFudWFyaW8gZGUgQ29tYnVzdGlibGVzLCBkZSBsYSBjdWFsIGNvbnRhbW9zIGRhdG9zIGRlc2RlIDE5MTMgaGFzdGEgMTk5Mi4gQSBkaWZlcmVuY2lhIGRlbCBjcnVkbywgc3VzIHZhbG9yZXMgcGFyYSBlbCBwZXLDrW9kbyAxOTgwLTE5OTIgbm8gY29pbmNpZGVuIGNvbiBsb3MgZGUgRUlBLCBwZXJvIGVzdMOhIMO6bHRpbWEgc8OtIGNvaW5jaWRlIGNvbiBsb3MgZGUgUmVnYWzDrWFzIGVudHJlIDE5OTkgeSAyMDE1LiBFbiBjYW1iaW8sIGxhIHNlcmllIGRlIFNFU0NPLCB0aWVuZGUgYSBjb250aW51YXIgbGEgZXZvbHVjacOzbiBkZSBFSUEgeSBSZWdhbMOtYXMsIHBlcm8gY29uIGVsIG5pdmVsIGRlbCBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgcG9yIGxvIHF1ZSBhbWJvcyBwYXJlcyBkZSBzZXJpZXMgcHVlZGVuIGVtcGFsbWFyIGNvaGVyZW50ZW1lbnRlIHNlZ8O6biBzdSBuaXZlbC4gTnVldmFtZW50ZSwgbG9zIHZhbG9yZXMgZGUgbGEgYmFzZSBkZSBSZWdhbMOtYXMgc29uIG1lbm9yZXMgZGViaWRvIGEgbGFzIGRlZHVjY2lvbmVzIGRlIHByb2R1Y2Npw7NuIHBhcmEgdHJpYnV0YXIgbWVub3MgcmVnYWzDrWFzLiBMYSBzZXJpZSBkZWwgTWluaXN0ZXJpbyBkZSBFY29ub23DrWEgdG9tYSBsb3MgdmFsb3JlcyBkZSBTRVNDTy5Qb3IgbG8gdGFudG8sIGVsIGNyaXRlcmlvIGRlIHNlbGVjY2nDs24gcGFyYSBsYSBzZXJpZSBkZSBwcm9kdWNjacOzbiBkZSBnYXMgcGFyYSBsb3MgY8OhbGN1bG9zIGVzIGVsIHNpZ3VpZW50ZToNCg0KKiBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBsYSBwcm9kdWNjacOzbiBkZSBnYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNCYXNlIE1FQ09ODQpwcm9kX21lY29uX2dhcyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1szXSwNCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGZyZWN1ZW5jaWFfbm9tYnJlID09ICJNZW5zdWFsIikgJT4lICANCiAgbXV0YXRlKGFuaW8gPSB5ZWFyKGZlY2hhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlLCBpbmRpY2Fkb3IsIHVuaWRhZF9kZV9tZWRpZGEpICU+JSANCiAgc3VtbWFyaXNlKGdhc19tZWNvbiA9IHN1bSh2YWxvcikpDQoNCiNCYXNlIHJlZ2FsaWFzDQpwcm9kX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3Byb2R1Y2Npb25fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw5FPIikgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIiwNCiAgICAgICAgIGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUocGFyc2VfZGF0ZV90aW1lKHBhc3RlMChhbmlvLCBNRVMpLCBvcmRlcnMgPSAieW0iKSkpICU+JSANCiAgc2VsZWN0KGZlY2hhLCB1bmlkYWQsICJUT1RBTCBDVUVOQ0EiLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogIHJlbmFtZShwcm9kX2dhc19NbTMgPSAiVE9UQUwgQ1VFTkNBIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQgKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIHN1bW1hcmlzZShnYXNfcmVnYWxpYXMgPSBzdW0ocHJvZF9nYXNfTW0zKSkNCg0KI0Jhc2UgU0VTQ08NCiNwcmUgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLWFudGVyaW9yLWFsLTIwMDkuY3N2IikgICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgQ2FudGlkYWQgKSAlPiUNCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpICU+JQ0KICBmaWx0ZXIoaWRjb25jZXB0byAhPSA0KSAlPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KI3Bvc3QgMjAwOQ0KcHJvZF9zZXNjb19nYXNfYiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9wcm9kdWNjaW4tZGUtZ2FzLXBvci15YWNpbWllbnRvLmNzdiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcyxpZGNvbmNlcHRvLCBjb25jZXB0bywgY2FudGlkYWQgKSAlPiUNCiAgZmlsdGVyKGlkY29uY2VwdG8gJWluJSBjKDEsMiwzKSklPiUNCiAgZ3JvdXBfYnkoYW5pbykgJT4lDQogIHN1bW1hcmlzZShnYXNfc2VzY28gPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JQ0KICBtdXRhdGUodW5pZGFkID0gIk1pbGVzIGRlIG0zIikNCg0KcHJvZF9zZXNjb19nYXMgPC0gcHJvZF9zZXNjb19nYXNfYSAlPiUNCiAgYmluZF9yb3dzKHByb2Rfc2VzY29fZ2FzX2IpDQoNCiNzZXNjbyBoaXN0b3JpYw0KcHJvZF9zZWNfZW5lcmdpYV9nYXMgPC0gcmVhZC5jc3YoICIuLi9kYXRhL3NlY3JldGFyaWFfZW5lcmdpYS9zZXNjby9wcm9kdWNjaW9uZ2FzbmF0dXJhbGRlc2RlLTE5NTAuY3N2IikgJT4lIA0KICBtdXRhdGUocHJvZHVjY2lvbl9nYXNfbmF0dXJhbCA9IHByb2R1Y2Npb25fZ2FzX25hdHVyYWwqMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpICU+JSANCiAgcmVuYW1lKHNlY19lbmVyZ2lhX3Byb2QgPSBwcm9kdWNjaW9uX2dhc19uYXR1cmFsKSANCg0KDQoNCiNFSUENCnByb2RfZWlhX2RyeV9uYXR1cmFsX2dhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvRHJ5X25hdHVyYWxfZ2FzX3Byb2R1Y3Rpb25fQXJnZW50aW5hX0FubnVhbC5jc3YiLCANCiAgICBza2lwID0gNCkgICU+JSANCiAgcmVuYW1lKGFuaW8gPSBZZWFyLA0KICAgICAgICAgcHJvZF9laWEgPSBgU2VyaWVzIElEOiBJTlRMLjI2LTEtQVJHLUJDRi5BIGJpbGxpb24gY3ViaWMgZmVldGApICU+JSANCiAgbXV0YXRlKHByb2RfZWlhID0gY29udmVyc29yX2Z0M20zX3EocHJvZF9laWEgKiAxMDAwMDAwKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIpDQoNCg0KIyBDb21wYXJhY2nDs24gZW50cmUgc2VyaWVzDQpwcm9kX21lcmdlX2dhcyA8LSAgcHJvZF9yZWdhbGlhc19nYXMgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZWNvbl9nYXMgICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGdhc19tZWNvbikpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBnYXNfcmVnYWxpYXMsIGdhc19tZWNvbikgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9zZXNjb19nYXMpICU+JSAgDQogIGZ1bGxfam9pbihwcm9kX2FudWFyaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZ2FzX2FudWFyaW8gPSBnYXNfYW51YXJpb19NTW0zICkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZ2FzX2FudWFyaW8gPSBnYXNfYW51YXJpbyAqIDEwMDAsDQogICAgICAgICAgICAgICAgICAgICB1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKSkgJT4lIA0KICAgICAgbGVmdF9qb2luKHByb2Rfc2VjX2VuZXJnaWFfZ2FzICU+JSBzZWxlY3QoYW5pbywgc2VjX2VuZXJnaWFfcHJvZCkpICU+JSANCiAgbGVmdF9qb2luKHByb2RfZWlhX2RyeV9uYXR1cmFsX2dhcyAlPiUgcmVuYW1lKGdhc19laWEgPSBwcm9kX2VpYSkpICU+JSANCiAgbXV0YXRlKHByb2RfZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gZ2FzX2FudWFyaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBnYXNfc2VzY28pLA0KICAgICAgICAgIHZhcmlhYmxlID0gICJQcm9kdWNjacOzbiBkZSBnYXMgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIikgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgc2VsZWN0KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQsIHByb2RfZ2FzLCBldmVyeXRoaW5nKC4pKSAlPiUgDQogICBmaWx0ZXIoIWlzLm5hKHByb2RfZ2FzKSkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBnYXNfcmVnYWxpYXMsDQogICAgICAgICBtZWNvbiA9IGdhc19tZWNvbiwNCiAgICAgICAgIHNlc2NvID0gZ2FzX3Nlc2NvLA0KICAgICAgICAgYW51YXJpb19jb21idXN0aWJsZXMgPWdhc19hbnVhcmlvLA0KICAgICAgICAgZWlhID0gZ2FzX2VpYSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCg0KIyB3cml0ZS5jc3YocHJvZF9tZXJnZV9nYXMsIGZpbGUgPSAicmVzdWx0YWRvcy9wcm9kdWNjaW9uX2dhcy5jc3YiKQ0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByb2RfbWVyZ2VfZ2FzLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcHJvZHVjY2lvbl9nYXMueGxzeCIpDQoNCiNkaWZlcmVuY2lhIHByb21lZGlvIGRlbCAxNCUgZW50cmUgbGFzIGJhc2VzIChlcyBtYXlvciBsYSBkZSBtZWNvbikNCiMgc3VtbWFyeShwcm9kX21lcmdlX2dhcykNCg0KcHJvZF9tZXJnZV9nYXNfTU1CVFUgPC0gcHJvZF9tZXJnZV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvLCB2YXJpYWJsZSwgdW5pZGFkKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9tM01NQlRVX3EoeCoxMDAwKX0pICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNTUJUVSIpICU+JQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCnByb2RfbWVyZ2VfZ2FzX2JlcCA8LSBwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgbXV0YXRlX2FsbChjb252ZXJzb3JfTU1CVFViZXBfcSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIkJFUCIpDQogIA0KIyB3cml0ZS5jc3YocHJvZF9tZXJnZV9nYXNfYmVwLCBmaWxlID0gInJlc3VsdGFkb3MvcHJvZF9tZXJnZV9nYXNfYmVwLmNzdiIpDQpgYGANCg0KPGJyPg0KKipUYWJsYSAyLiBQcm9kdWNjacOzbiBkZSBnYXMgbmF0dXJhbCBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChNTUJUVSkqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgc2VsZWN0KC1wcm9kX2dhcykNCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2dwbG90bHkocHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICBzZWxlY3QoLXByb2RfZ2FzKSAlPiUNCiAgbXV0YXRlKHJlZ2FsaWFzID0gY2FzZV93aGVuKHJlZ2FsaWFzID09IDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByZWdhbGlhcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvciwgNDpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIDIuIFByb2R1Y2Npw7NuIGRlIGdhcy4NCiAgICAgICAgQXJnZW50aW5hICgxOTEzIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiTU1CVFUiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBlbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBBbnVhcmlvIGRlIENvbWJ1c3RpYmxlcywgRUlBLCBNaW5pc3RlcmlvIGRlIEVjb25vbcOtYSwgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzIHkgU0VTQ08pIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCiMjIyBQcm9kdWNjaW9uIHRvdGFsDQpgYGB7cn0NCnByb2R1Y2Npb25fdG90YWwgPC0gcHJvZF9tZXJnZV9nYXNfYmVwICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCxwcm9kX2dhcykgJT4lDQogIGxlZnRfam9pbihwcm9kX21lcmdlX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCxwcm9kX2NydWRvKSAlPiUgIG11dGF0ZSh1bmlkYWQgPSJCRVAiKSApICU+JSANCiAgbXV0YXRlKHByb2R1Y2Npb25fdG90YWxfYmVwID0gcHJvZF9jcnVkbyArIHByb2RfZ2FzKQ0KDQpwcm9kdWNjaW9uX3RvdGFsDQpgYGANCg0KDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMjIENydWRvIHByb2Nlc2Fkbw0KDQpgYGANCg0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIyBWZW50YXMNCiAjIENydWRvIHkgR2FzDQoNCiMgKiBbU0VTQ08gLSBSZWZpbmFjacOzbiB5IENvbWVyY2lhbGl6YWNpw7NuIGRlIHBldHLDs2xlbywgZ2FzIHkgZGVyaXZhZG9zXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcmVmaW5hY2lvbi15LWNvbWVyY2lhbGl6YWNpb24tZGUtcGV0cm9sZW8tZ2FzLXktZGVyaXZhZG9zLXRhYmxhcy1kaW5hbWljYXMpDQojIA0KIyAgRGF0b3MgZGUgY2FudGlkYWRlcw0KIyAgDQojY29tcHJhcyBlbXByZXNhcyBkZWwgc2VjdG9yDQpjb21wcmFzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1NFU0NPL1JlZmluYWNpw7NuIHkgY29tZXJjaWFsaXphY2lvbi9jb21wcmFzLmNzdiIpDQoNCiN2ZW50YXMgbWRvIGludGVybm8uIGNhbnRpZGFkZXMuIHBvc3QgMjAxMA0KdmVudGFzX21lcmNhZG9fcHJvZHVjdG9fZW1wcmVzYSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vdmVudGFzLW1lcmNhZG8tcHJvZHVjdG8tZW1wcmVzYS5jc3YiLCANCiAgICBsb2NhbGUgPSBsb2NhbGUoZW5jb2RpbmcgPSAiSVNPLTg4NTktMSIpKQ0KDQojdmVudGFzIG1kbyBpbnRlcm5vLiBjYW50aWRhZGVzLiBwb3N0IDIwMTANCnZlbnRhc19hX2VtcHJlc2FzX2RlbF9zZWN0b3IgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL3ZlbnRhcy1hLWVtcHJlc2FzLWRlbC1zZWN0b3IuY3N2IikNCg0KYGBgDQoNCg0KIyMgUHJlY2lvIE1lcmNhZG8gSW50ZXJubw0KDQpGdWVudGVzOiANCg0KKiBbQmFzZSBNaW5pc3RlcmlvIGRlIEhhY2llbmRhLCBJbmZvcm1lcw0KU2VjdG9yaWFsZXNdKGh0dHBzOi8vd3d3LmFyZ2VudGluYS5nb2IuYXIvZWNvbm9taWEvcG9saXRpY2FlY29ub21pY2EvcmVnaW9uYWx5c2VjdG9yaWFsL2luZm9ybWVzcHJvZHVjdGl2b3MpDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYS1SZWdhbGlhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZ2FsaWFzLWRlLXBldHJvbGVvLWNydWRvLWdhcy1uYXR1cmFsLWdscC1nYXNvbGluYS15LWNvbmRlbnNhZG8pDQogICsgUG9yIGF1c2VuY2lhIGRlIGluZm9ybWFjacOzbiwgZWwgcHJlY2lvIGRlIHJlZ2FsaWFzIGVudHJlIDE5OTMgeSAxOTk4IGVzIGVsIHByZWNpbyB0b3RhbCAoZXMgZGVjaXIsIGVzIHVuIHBvbmRlcmFkbyBxdWUgaW5jbHV5ZSB0YW1iacOpbiBlbCBwcmVjaW8gZGVsIG1lcmNhZG8gZXh0ZXJubykuIEVuIGxvcyBhw7FvcyBwb3N0ZXJpb3JlcywgZGljaG8gcHJlY2lvIHPDrSBjb3JyZXNwb25kZSBhbCBkZWwgbWVyY2FkbyBpbnRlcm5vLiAgDQoqIEtvenVsaiB5IFBpc3RvbmVzaS4gUmV2aXN0YSAgZGVsIEluc3RpdHV0byBkZSBFY29ub23DrWEgRW5lcmfDqXRpY2EgKElERUUpIC0gRnVuZGFjacOzbiBCYXJpbG9jaGUgICgxOTcwIC0gMTk4OCkuIFByZWNpbyBvZmljaWFsIGludGVybm8gZGUgbGEgY3VlbmNhIG5ldXF1aW5hIGEgdGFzYSBkZSBjYW1iaW8gb2ZpY2lhbC4gTGFzIGZ1ZW50ZXMgdXRpbGl6YWRhcyBkZSBlc3RhIHJldmlzdGEgc29uIFNlY3JldGFyaWEgZGUgRW5lcmfDrWEsIFlQRiwgR2FzIGRlbCBFc3RhZG8sIEJvbGV0aW4gSW5mb3JtYXRpdm8gZGUgVGVjaGludCB5IHNlcmllcyBwcm9waWFzIGRlIElERUUNCiogTWVtb3JpYSBBbnVhbCB5IGJhbGFuY2VzIGNvbnRhYmxlcyBkZSBZUEYgKHZhcmlvcyBhw7FvcykuIFByZWNpbyBpbnRlcm8gcHJvbWVkaW8gcmVzdWx0YW50ZSBkZSBsYSByZWxhY2nDs24gZW50cmUgdmVudGFzIHkgY2FudGlkYWRlcyBwcm9kdWNpZGFzLg0KKiBQcmVjaW9zIGFudWFyaW8uICoqRkFMVEEgQlVTQ0FSKioNCg0KKioqdmVyIGRlIGRvbmRlIHNhY2FuIGVsIFRDQyoqKg0KKioqY2FtYmlhciBwcmVjaW8gZGVsIDkyIHBvciBtZWNvbiBlc3RpbWFkbyB5IHZhbG9yZXMgcmVzdGFudGVzIHBvciBlc3RpbWFkbyBkZSBpZGVlKioqDQoNCiMjIyMgIFByZWNpbyBNZXJjYWRvIEludGVybm8gZGUgQ3J1ZG8NCg0KKiBDcml0ZXJpbyBwYXJhIHByZWNpb19jcnVkbzogDQogICsgMTk2MyBhIDE5NjU6IEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRSBhanVzdGFkbyBjb24gZWwgw61uZGljZSBkZWwgcHJlY2lvIGRlbCBBbnVhcmlvIGRlIFlQRiANCiAgKyAxOTg5IGEgMTk5MTogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTY2IGEgMTk4ODogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MjogTUVDT04gYWp1c3RhZG8gY29uIGxhIHZhcmlhY2nDs24gZGVsIMONbmRpY2UgZGUgcHJlY2lvcyBpbnRlcm5vcyBhbCBwb3IgbWF5b3IgKElQSU0pDQogICsgMTk5MyBlbiBhZGVsYW50ZTogTUVDT04gDQogDQogIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNNZW1vcmlhcyBkZSBZUEYNCnZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVtb3JpYSBZUEYvdnRhc192YWxvcl9jYW50aWRhZF9wcmVjaW9fY3J1ZG8ueGxzeCIpICU+JSANCiAgcmVuYW1lKGNhbnRfdmVuZGlkYWQgPSAibTMiLCB2YWxvcl92ZW5kaWRvID0gInZhbG9yIiwgcHJlY2lvX2EgPSAiJC9tMyIsIA0KICAgICAgICAgdGNjX2RpYyA9ICJDb3RpeiBkaWMgVSRTIiwgcHJlY2lvX3VzZCA9ICJVJFMgKGEgZGljaWVtYnJlIGRlIGNhZGEgYcOxbykiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfY2FudCA9ICJtMyIsDQogICAgICAgICBwcmVjaW9fbWlfcGVzb3NfeXBmX2NydWRvID0gdmFsb3JfdmVuZGlkby9jYW50X3ZlbmRpZGFkLCANCiAgICAgICAgIHByZWNpb19taV95cGZfY3J1ZG8gPSBwcmVjaW9fbWlfcGVzb3NfeXBmX2NydWRvIC8gdGNjX2RpYykgJT4lIA0KICAjIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JQ0KICAjIG11dGF0ZShwcmVjaW9fbWlfdXNkX3lwZl9jcnVkbyA9IHByZWNpb19taV95cGZfY3J1ZG8gLyB0Y2MpICU+JSAjcmVjYWxjdWxvIGRlIHByZWNpbyBjb24gbnVldm8gVEMNCiAgc2VsZWN0KGFuaW8sdW5pZGFkX2NhbnQsIG1vbmVkYSwgdmFsb3JfdmVuZGlkbywgY2FudF92ZW5kaWRhZCwgDQogICAgICAgICBwcmVjaW9fbWlfcGVzb3NfeXBmX2NydWRvLHRjY19kaWMsICBwcmVjaW9fbWlfeXBmX2NydWRvKQ0KDQojIEJhc2UgTUVDT04NCnByZWNpb19taV9tZWNvbl9jcnVkbyA8LSBoaWRyb2NhcmJ1cm9zX2Jhc2VfbWVjb24gJT4lIA0KICBmaWx0ZXIoaW5kaWNhZG9yID09IGxpc3RhX2ZpbHRyb1syXSwgDQogICAgICAgICBhY3RpdmlkYWRfcHJvZHVjdG9fbm9tYnJlID09ICJQZXRyw7NsZW8gY3J1ZG8iLA0KICAgICAgICAgYWxjYW5jZV90aXBvID09ICJQQUlTIikgJT4lDQogIG11dGF0ZShhbmlvID0geWVhcihmZWNoYSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX21lY29uX2NydWRvID0gbWVhbih2YWxvcikpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvbTMiKQ0KDQoNCiNNRUNPTiAvIENVRU5UQVMgTkFDSU9OQUxFUyANCnByZWNpb3NfbWVjb24gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJQcmVjaW9zIiwgc2tpcCA9IDcpICU+JSANCiAgcmVuYW1lKGFuaW8gPSAiLi4uMSIsDQogICAgICAgICBtZXMgPSAiLi4uMiIsDQogICAgICAgICBwcmVjaW9fY29icmVfY19sYiA9ICJDb3RpemFjacOzbiBCb2xzYSBkZSBMb25kcmVzIChMTUUpIiwNCiAgICAgICAgIHByZWNpb19vcm9fdXNkX296dCA9ICAiQ290aXphY2nDs24gQm9sc2EgZGUgTnVldmEgWW9yayAoQ09NRVgpIiwNCiAgICAgICAgIHByZWNpb19wbGF0YV91c2Rfb3p0ID0gIkNvdGl6YWNpw7NuIExvbmRvbiBCdWxsaW9uIE1hcmtldCBBc3NvY2lhdGlvbiAoTEJNQSkiLA0KICAgICAgICAgcHJlY2lvX2NpbmNfY19sYiA9ICJDb3RpemFjacOzbiBMTUUiLA0KICAgICAgICAgcHJlY2lvX2hpZXJyb191c2RfdG4gPSAiNjcsNTUlIEJyYXNpbCIsDQogICAgICAgICBwcmVjaW9fcGxvbW9fdXNkX3RuID0gIkxvbmRvbiBNZXRhbCBFeGNoYW5nZSIsDQogICAgICAgICBwcmVjaW9fZ2FzX21lX3Blc29zX01tMyA9ICJtZXJjYWRvIGV4dGVybm8uLi45IiwNCiAgICAgICAgIHByZWNpb19nYXNfbWlfcGVzb3NfTW0zID0gIm1lcmNhZG8gaW50ZXJuby4uLjEwIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19tZV91c2RfbTMgPSAibWVyY2FkbyBleHRlcm5vLi4uMTEiLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgID0gIi4uLjEyIiwNCiAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfbTMgPSAibWVyY2FkbyBpbnRlcm5vLi4uMTMiLA0KICAgICAgICAgcHJlY2lvX2NydWRvX21pX3VzZF9iYmwgID0gIi4uLjE0IiwNCiAgICAgICAgIHByb21lZGlvX2JyZW50X2R1YmFpX3d0aV91c2RfYmJsID0gIlByb21lZGlvIEJyZW50LUR1YmFpLVdUSSIsDQogICAgICAgICBicmVudF91a191c2RfYmJsID0iQnJlbnQgIFB1ZXJ0b3MgR3JhbiBCcmV0YcOxYSIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fZ2FzX21lX3Blc29zX01tMyA9IG1lYW4ocHJlY2lvX2dhc19tZV9wZXNvc19NbTMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcmVjaW9fZ2FzX21pX3Blc29zX01tMyA9IG1lYW4oIHByZWNpb19nYXNfbWlfcGVzb3NfTW0zLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgPSBtZWFuKCBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIHByZWNpb19jcnVkb19taV91c2RfYmJsID0gbWVhbiggcHJlY2lvX2NydWRvX21pX3VzZF9iYmwsIG5hLnJtID0gVCksDQogICAgICAgICAgICBwcm9tZWRpb19icmVudF9kdWJhaV93dGlfdXNkX2JibCA9IG1lYW4oIHByb21lZGlvX2JyZW50X2R1YmFpX3d0aV91c2RfYmJsLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgYnJlbnRfdWtfdXNkX2JibCA9IG1lYW4oIGJyZW50X3VrX3VzZF9iYmwsIG5hLnJtID0gVCkpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCkgJT4lIA0KICBtdXRhdGUoIHByZWNpb19jcnVkb19tZV9wZXNvc19iYmwgPSAgcHJlY2lvX2NydWRvX21lX3VzZF9iYmwgKlRDQywNCiAgICAgICAgICBwcmVjaW9fY3J1ZG9fbWlfcGVzb3NfYmJsID0gIHByZWNpb19jcnVkb19taV91c2RfYmJsICpUQ0MpDQoNCg0KIyMgQmFzZSByZWdhbGlhcw0KcHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmVnYWxpYXMvcHJlY2lvX21lcmNhZG9faW50ZXJub19jcnVkb19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfdGlwb19jcnVkbyA9ICJUT1RBTCBUSVBPIERFIENSVURPIikgJT4lIA0KICAgIG11dGF0ZSh1bmlkYWQgPSAiVVNEL20zIiwNCiAgICAgICAgIGFuaW8gPSBuYS5sb2NmKGFuaW8pKSAlPiUgIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIHRvdGFsX3RpcG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1jKEJSRU5ULCBXVEkpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gInRpcG9fY3J1ZG8iLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNTpuY29sKC4pKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIHN1bW1hcmlzZShwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8gPSBtZWFuKHRvdGFsX3RpcG9fY3J1ZG8pLA0KICAgICAgICAgICAgcHJlY2lvX3Byb21lZGlvX3RpcG9fY3J1ZG8gPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBpbnRlcm5vIikNCg0KIyBSZXZpc3RhIElERUUNCiMgcHJlY2lvcyBpbnRlcm5vcyB2cyBwcmVjaW8gcHJvbWVkaW8gaW50ZXJubyBkZSBlZXV1IHZzIHByZWNpbyBhcmFiYWkgc2F1ZGl0YS4gY3VhZHJvIDMuMS4zLjEgcC4xNzANCnByZWNpb19taV92c19pbnRlcm5hY2lvbmFsX2lkZWVfY3J1ZG8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZXZpc3RhcyBQb2zDrXRpY2FzIGRlIFByZWNpb3MgZGUgbGEgRW5lcmdpYSBlbiBBcmcgMTk3MC0xOTg4L1ByZWNpb3MgZGVsIHBldHJvbGVvIGNydWRvIHkgZGVyaXZhZG9zIDE5NzAgLSAxOTg5Lnhsc3giLCANCiAgICBza2lwID0gMSwgc2hlZXQgPSA0KQ0KDQoNCiNtZXJnZQ0KcHJlY2lvX21pX2NydWRvIDwtIHByZWNpb19taV9yZWdhbGlhc19jcnVkbyAlPiUgIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fbWlfcmVnYWxpYXNfY3J1ZG8pICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9tZWNvbl9jcnVkbyApICU+JSANCiAgZnVsbF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICAgcHJlY2lvX21pX3lwZl9jcnVkbyApKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19taV9pZGVlX2NydWRvID0gcHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9tMyIpICU+JSANCiAgbXV0YXRlX2F0KC52YXJzID0gYygicHJlY2lvX21pX3JlZ2FsaWFzX2NydWRvIiwgDQogICAgICAgICAgICAgICAgICAgICAgInByZWNpb19taV9tZWNvbl9jcnVkbyIsICJwcmVjaW9fbWlfeXBmX2NydWRvIiwgInByZWNpb19taV9pZGVlX2NydWRvIiksIA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNiYmxfcCkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWlfbWVjb25fY2Nubl9jcnVkbyA9IHByZWNpb19jcnVkb19taV91c2RfYmJsICkpICU+JSANCiAgbGVmdF9qb2luKGlwaW1fYmFzZTk0ICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGlwaW1fbml2ZWxfZ3JhbF85NCksIGJ5ID0gImFuaW8iKSAlPiUgDQogIHJlbmFtZShyZWdhbGlhcyA9IHByZWNpb19taV9yZWdhbGlhc19jcnVkbywNCiAgICAgICAgIG1lY29uID0gcHJlY2lvX21pX21lY29uX2NydWRvLA0KICAgICAgICAgeXBmID0gcHJlY2lvX21pX3lwZl9jcnVkbywNCiAgICAgICAgIGlkZWUgPSBwcmVjaW9fbWlfaWRlZV9jcnVkbywNCiAgICAgICAgIG1lY29uX2Njbm4gPSBwcmVjaW9fbWlfbWVjb25fY2Nubl9jcnVkbykgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JSANCiAgdW5ncm91cCgpDQpwcmVjaW9fbWlfY3J1ZG8gPC0gIHByZWNpb19taV9jcnVkbyAlPiUgDQogIG11dGF0ZSggdW5pZGFkID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICAgIHZhcmlhYmxlID0gICJQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIsDQogICAgICAgICAgbWVjb25fZXN0aW1hZG8gPSBwcmVjaW9fbWlfY3J1ZG8kbWVjb25bcHJlY2lvX21pX2NydWRvJGFuaW89PTE5OTRdKmlwaW1fbml2ZWxfZ3JhbF85NCwNCiAgICAgICAgICBpbmRpY2VfeXBmXzcyID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWUgPSB5cGYsIGZlY2hhID0gYW5pbywgZmVjaGFfYmFzZSA9IDE5NzIpLA0KICAgICAgICAgaWRlZV9lc3RpbWFkbyA9IHByZWNpb19taV9jcnVkbyRpZGVlW3ByZWNpb19taV9jcnVkbyRhbmlvPT0xOTcyXSAqIGluZGljZV95cGZfNzIsDQogICAgICAgICBwcmVjaW9fY3J1ZG9fbWRvaW50ID0gICBjYXNlX3doZW4oDQogICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NjM6MTk2NSB+IGlkZWVfZXN0aW1hZG8sDQogICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NjY6MTk4OCB+IGlkZWUsDQogICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5ODk6MTk5MSB+IHlwZiwNCiAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgfiBtZWNvbl9lc3RpbWFkbywNCiAgICAgICAgICAgICAgICBhbmlvID4xOTkyIH4gbWVjb24pKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHZhcmlhYmxlLCBwcmVjaW9fY3J1ZG9fbWRvaW50ICwgZXZlcnl0aGluZyguKSwgDQogICAgICAgICAtYyhpcGltX25pdmVsX2dyYWxfOTQsIGlkZWVfZXN0aW1hZG8sbWVjb25fZXN0aW1hZG8saW5kaWNlX3lwZl83MixpZGVlX2VzdGltYWRvICkpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQogIA0KICANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfY3J1ZG8sIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWlfY3J1ZG8ueGxzeCIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwgKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQoLiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhbmlvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJlY2lvX2NydWRvX25ldXF1aW5hX3RjX29maWNpYWwpICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh2YXJpYWJsZSA9ICJwcmVjaW9fY3J1ZG9fbmV1cXVpbmFfdGNfb2ZpY2lhbCBlbiBVU0QvbTMiKSAlPiUNCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh2YXJpYWJsZSwgZXZlcnl0aGluZyguKSksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJwcmVjaW9fbWlfdnNfaW50ZXJuYWNpb25hbF9pZGVlX2NydWRvLnhsc3giKQ0KYGBgDQoNCjxicj4NCioqVGFibGEgMy4gUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIHBldHLDs2xlbyBjcnVkbyBlbiBBcmdlbnRpbmEgc2Vnw7puIGRpc3RpbnRhcyBmdWVudGVzIChiYXJyaWxlcykqKg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnByZWNpb19taV9jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX2NydWRvX21kb2ludCkNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdncGxvdGx5KHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICBzZWxlY3QoLXByZWNpb19jcnVkb19tZG9pbnQpICU+JSANCiAgICAgIG11dGF0ZShyZWdhbGlhcyA9IA0KICAgICAgICAgICAgICAgY2FzZV93aGVuKHJlZ2FsaWFzID09IDAgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHJlZ2FsaWFzKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlID0gdmFsb3IsIDQ6bmNvbCguKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHZhcmlhYmxlLCBzaGFwZSA9IHZhcmlhYmxlKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOCkrDQogIGxhYnModGl0bGUgPSAiR3LDoWZpY28gMy4gUHJlY2lvcyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBwZXRyw7NsZW8gY3J1ZG8uDQogICAgICAgQXJnZW50aW5hICgxOTYzIC0gMjAyMCkiLA0KICAgICAgIHkgPSAiVVNEL2JhcnJpbCIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiksIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQogICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQoNCiMjIyMgUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBHYXMgTmF0dXJhbA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIGdhczoNCiAgKyAxOTYzIC0gMTk2OSAmIDE5ODkgLSAxOTkyOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NzAgLSAxOTg4OiAgS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFDQogICsgMTk5MyBlbiBhZGVsYW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgLSBCYXNlIFJlZ2Fsw61hcw0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojQW51YXJpbyBZUEYNCnZ0YXNfcHJlY2lvX21lbW9feXBmX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lbW9yaWEgWVBGL3Z0YXNfdmFsb3JfY2FudGlkYWRfcHJlY2lvX2dhcy54bHN4IikgJT4lIA0KICAgIHJlbmFtZShjYW50X3ZlbmRpZGFkID0gIm0zIiwgdmFsb3JfdmVuZGlkbyA9ICIkIiwgbW9uZWRhID0gIk1vbmVkYSIpICU+JSANCiAgbGVmdF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2NydWRvICU+JSBzZWxlY3QoYW5pbywgbW9uZWRhLCB0Y2NfZGljICkpICU+JSANCiAgbXV0YXRlKHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCA9ICh2YWxvcl92ZW5kaWRvL2NhbnRfdmVuZGlkYWQpIC8gMTAwMCwNCiAgICAgICAgIHByZWNpb19taV91c2RfeXBmX2dhcyA9IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCAvIHRjY19kaWMsDQogICAgICAgICBwcmVjaW9fbWlfeXBmX2dhcyA9IGNhc2Vfd2hlbiggI2hvbW9nZW5pemFtb3MgbG9zIGNhbWJpb3MgZGUgbW9uZWRhDQogICAgICAgICAgIG1vbmVkYSA9PSAibSRuIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkYG0kbmAgLA0KICAgICAgICAgICBtb25lZGEgPT0gIiRsZXkiIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgJExleWAsIA0KICAgICAgICAgICBtb25lZGEgPT0gIiRhcmciIH4gcHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsL2NvbnZlcnNvcl9wZXNvcyRgJGFgLCANCiAgICAgICAgICAgbW9uZWRhID09ICJBIiB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbC9jb252ZXJzb3JfcGVzb3MkQSwNCiAgICAgICAgICAgVCB+IHByZWNpb19taV95cGZfZ2FzX21vbmVkYV9vcmlnaW5hbCksDQogICAgICAgICBtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgI2FjbGFyYW1vcyBsYSB1bmlkYWQgbW9uZXRhcmlhIHlhIHRyYW5zZm9ybWFkYQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBtb25lZGEsIHZhbG9yX3ZlbmRpZG8sIGNhbnRfdmVuZGlkYWQsIA0KICAgICAgICAgcHJlY2lvX21pX3lwZl9nYXMscHJlY2lvX21pX3lwZl9nYXNfbW9uZWRhX29yaWdpbmFsLCB0Y2NfZGljLCBwcmVjaW9fbWlfdXNkX3lwZl9nYXMpDQoNCiNBbnVhcmlvIENvbWJ1c3RpYmxlDQphbnVhcmlvX2RlX2NvbWJ1c3RpYmxlIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvQW51YXJpbyBDb21idXN0aWJsZXMvYW51YXJpbyBkZSBjb21idXN0aWJsZS54bHN4IikgJT4lIA0KICBmaWx0ZXIobWVyY2FuY2lhID09ICJnYXNfbmF0dXJhbCIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyAsICAgICBtZXMsICAgICAgdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gbWVhbih2YWxvcikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbyAsICAgICAgIHVuaWRhZCApICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9hbnVhcmlvX2dhcyA9IG1lYW4ocHJlY2lvX21pX2FudWFyaW9fZ2FzKSkgJT4lIA0KICBtdXRhdGUocHJlY2lvX21pX2FudWFyaW9fZ2FzID0gKHByZWNpb19taV9hbnVhcmlvX2dhcy9jb252ZXJzb3JfcGVzb3MkQSkvMTAwMCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQojIEJhc2UgTUVDT04NCnByZWNpb3NfaW50ZXJub3NfbWVjb25fZ2FzIDwtIGhpZHJvY2FyYnVyb3NfYmFzZV9tZWNvbiAlPiUgDQogIGZpbHRlcihpbmRpY2Fkb3IgPT0gbGlzdGFfZmlsdHJvWzJdLCANCiAgICAgICAgIGFjdGl2aWRhZF9wcm9kdWN0b19ub21icmUgPT0gIkdhcyBuYXR1cmFsIiwNCiAgICAgICAgIGFsY2FuY2VfdGlwbyA9PSAiUEFJUyIpICU+JQ0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHByZWNpb19taV9tZWNvbl9nYXMgPSBtZWFuKHZhbG9yKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gImFycy9NaWxlcyBkZSBtMyIpDQoNCg0KIyMgQmFzZSByZWdhbGlhcw0KI3ZhbG9yZXMgOTMgLSA5OA0KcHJlY2lvX3JlZ2FsaWFzX3RvdGFsX2dhcyA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX21pX2dhcy54bHN4IiwNCiAgICBzaGVldCA9ICJqayIpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAxOTk5KSAlPiUgDQogIG11dGF0ZShwcmVjaW9fdG90YWxfZ2FzID0gcHJlY2lvX21pX2dhcyAqIDEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikgJT4lIA0KICBzZWxlY3QoLXByZWNpb19taV9nYXMpDQoNCiN2YWxvcmVzIHBvc3QgOTkNCnByZWNpb19yZWdhbGlhc19taV9nYXMgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9SZWdhbGlhcy9wcmVjaW9fbWVyY2Fkb19pbnRlcm5vX2dhc19yZWdhbGlhcy5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JQ0KICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JSANCiAgc2VsZWN0KGFuaW8sIG1lcywgdW5pZGFkLCAgZXZlcnl0aGluZyguKSkgJT4lIA0KICBnYXRoZXIoLiwNCiAgICAgICAgIGtleSA9ICJjdWVuY2EiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCwgY3VlbmNhKSAlPiUgDQogIHN1bW1hcmlzZShwcmVjaW9fcHJvbWVkaW9fY3VlbmNhID0gbWVhbih2YWxvcikpJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBpbnRlcm5vIikgJT4lIA0KICBmaWx0ZXIoY3VlbmNhID09ICJ0b3RhbF9jdWVuY2EiKSU+JSAgI3F1aXRvIHByZWNpbyBwcm9tZWRpbyBlbGFib3JhZG8gcHEgbm8gc2UgdXNhcsOhDQogIGxlZnRfam9pbihwcmVjaW9fcmVnYWxpYXNfdG90YWxfZ2FzKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk5IH4gcHJlY2lvX3RvdGFsX2dhcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHByZWNpb19wcm9tZWRpb19jdWVuY2EpKSAlPiUgDQogIHNlbGVjdCgtYyhwcmVjaW9fdG90YWxfZ2FzLCBwcmVjaW9fcHJvbWVkaW9fY3VlbmNhKSkNCg0KI1JldmlzdGEgSURFRQ0KI3ByZWNpbyB0cmFuc2ZlcmVuY2lhLCByZWdhbGlhcywgY29tcGVuc2FjaW9uZXMsIGV0YyBwcm9tZWRpbyBhbnVhbA0KcHJlY2lvX21pX2lkZWVfZ2FzIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUmV2aXN0YXMgUG9sw610aWNhcyBkZSBQcmVjaW9zIGRlIGxhIEVuZXJnaWEgZW4gQXJnIDE5NzAtMTk4OC9QcmVjaW9zIGRlbCBnYXMgbmF0dXJhbCB5IGRlcml2YWRvcyAxOTcwIC0gMTk4OC54bHN4IiwgDQogICAgc2tpcCA9IDEsIHNoZWV0ID0gMikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fdHJhbnNmZXJlbmNpYSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzcwKSkgJT4lDQogIG11dGF0ZShwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MgPSBwcmVjaW9fdHJhbnNmZXJlbmNpYSAqIGlwY183MCAvIGNvbnZlcnNvcl9wZXNvcyRgJExleWApICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSApICU+JSANCiAgbXV0YXRlKHByZWNpb19taV9pbmRleGFkb191c2QgPSBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MvdGNjICkgIA0KICAjIHNlbGVjdCgtYyh1bmlkYWQsIHByZWNpb190cmFuc2ZlcmVuY2lhKSkNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9pZGVlX2dhcywgcGF0aCA9ICJwcmVjaW9fbWlfaWRlZV9nYXMueGxzeCIpDQoNCiNjb252ZXJzb3IgZGUgbW9uZWRhIA0KIyAlPiUgDQojICAgbXV0YXRlKHByZWNpb190cmFuc2ZlcmVuY2lhID0gY2FzZV93aGVuKA0KIyAgICAgYW5pbyA8IDE5ODMgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYS9jb252ZXJzb3JfcGVzb3MkYCRMZXlgLA0KIyAgICAgYW5pbyA9PSAxOTgzIH4gcHJlY2lvX3RyYW5zZmVyZW5jaWEgLyBjb252ZXJzb3JfcGVzb3MkYCRhYCwNCiMgICAgIGFuaW8gJWluJSAxOTgzOjE5OTEgfiBwcmVjaW9fdHJhbnNmZXJlbmNpYS9jb252ZXJzb3JfcGVzb3MkQSkpDQoNCiNNZXJnZQ0KcHJlY2lvX21pX2dhcyA8LSBwcmVjaW9fcmVnYWxpYXNfbWlfZ2FzICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX21pX3JlZ2FsaWFzX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvc19pbnRlcm5vc19tZWNvbl9nYXMpICU+JSANCiAgZnVsbF9qb2luKHZ0YXNfcHJlY2lvX21lbW9feXBmX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsICBwcmVjaW9fbWlfeXBmX2dhcyApKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfaWRlZV9nYXMgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8gPSBwcmVjaW9fbWlfaW5kZXhhZG9fcGVzb3MpKSAlPiUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmVjaW9fbWlfaWRlZV9jdGVzX3Blc29zID0gcHJlY2lvX3RyYW5zZmVyZW5jaWEpKSAlPiUgDQogIGxlZnRfam9pbihhbnVhcmlvX2RlX2NvbWJ1c3RpYmxlKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBwcmVjaW9fbWlfbWVjb25fY2Nubl9nYXMgPSBwcmVjaW9fZ2FzX21pX3Blc29zX01tMykpICU+JSANCiAgIyBtdXRhdGUocHJlY2lvX2dhc19tZG9pbnQgPSBjYXNlX3doZW4oYW5pbyA8IDE5ODggfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODggfiAgcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5ODk6MTk5MSAgfiBwcmVjaW9fbWlfeXBmX2dhcywNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgIH4gcHJlY2lvX21pX3lwZl9nYXMvMTAsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTIgfiBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzKSwNCiAgIyAgICAgICAgZGlmX3lwZl9pZGVlID0gcHJlY2lvX21pX3lwZl9nYXMvcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8tMSApICU+JQ0KICBtdXRhdGUodmFyaWFibGUgPSAiUHJlY2lvIGRlbCBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyIsDQogICAgICAgICBwcmVjaW9fZ2FzX21kb2ludCA9IGNhc2Vfd2hlbihhbmlvICVpbiUgMTk2MzoxOTY5fGFuaW8gJWluJSAxOTg5OjE5OTEgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19taV95cGZfZ2FzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyAlaW4lIDE5NzA6MTk4OCB+IHByZWNpb19taV9pZGVlX2luZGV4YWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5OTIgIH4gcHJlY2lvX21pX3lwZl9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPiAxOTkyIH4gcHJlY2lvX21pX3JlZ2FsaWFzX2dhcykgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsdmFyaWFibGUsIHByZWNpb19nYXNfbWRvaW50LCBldmVyeXRoaW5nKC4pICkgJT4lIA0KICByZW5hbWUocmVnYWxpYXMgPSBwcmVjaW9fbWlfcmVnYWxpYXNfZ2FzLA0KICAgICAgICAgbWVjb24gPSBwcmVjaW9fbWlfbWVjb25fZ2FzLA0KICAgICAgICAgeXBmID0gcHJlY2lvX21pX3lwZl9nYXMsDQogICAgICAgICBpZGVlID0gcHJlY2lvX21pX2lkZWVfaW5kZXhhZG8sDQogICAgICAgICBtZWNvbl9jY25uID0gcHJlY2lvX21pX21lY29uX2Njbm5fZ2FzLA0KICAgICAgICAgYW51YXJpbyA9IHByZWNpb19taV9hbnVhcmlvX2dhcykgJT4lIA0KICBmaWx0ZXIoYW5pbyA8IDIwMjEpDQoNCiNwcmVjaW8gaW50ZXJubyBlbiBNTUJUVSBwZXNvcw0KcHJlY2lvX21pX2dhc19NTUJUVSA8LSAgcHJlY2lvX21pX2dhcyAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc2VsZWN0KC1jKHVuaWRhZCwgdmFyaWFibGUpKSAlPiUgDQogIG11dGF0ZV9hbGwoIGZ1bmN0aW9uKHgpIHtjb252ZXJzb3JfbTNNTUJUVV9wKHgvMTAwMCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01NQlRVIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KDQojcHJlY2lvIGludGVybm8gZW4gTU1CVFUgdXNkDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkIDwtIHByZWNpb19taV9nYXNfTU1CVFUgJT4lDQogICMgc2VsZWN0KC1kaWZfeXBmX2lkZWUpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogbGVmdF9qb2luKHRjcF9hbnVhbF9iLCBieSA9ICJhbmlvIikgJT4lDQogIG11dGF0ZSh2YWxvciA9IHZhbG9yLyB0Y2MsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICBzZWxlY3QoLWModGNjLHRjcCwgc29icmV2YWx1YWNpb24pKSAlPiUgDQogIHNwcmVhZChrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IpDQoNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KHByZWNpb19taV9nYXMsIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWlfZ2FzLnhsc3giKQ0KDQojcHJlY2lvIHJldmlzdGEgdHJhbnNwdWVzdG8NCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fbWlfaWRlZV9nYXMgJT4lIA0KIyAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcmVjaW9fdHJhbnNmZXJlbmNpYV95cGZfYV9HRSA9cHJlY2lvX3RyYW5zZmVyZW5jaWEgKSAlPiUgDQojICAgICAgICAgICAgICAgICAgICAgICBzcHJlYWQoLiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhbmlvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcHJlY2lvX3RyYW5zZmVyZW5jaWFfeXBmX2FfR0UpICU+JSANCiMgICAgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh2YXJpYWJsZSA9ICJwcmVjaW9fdHJhbnNmZXJlbmNpYV95cGZfYV9HRSBlbiBwZXNvcyBkZSAxOTcwLzEwMDAgbTMiKSAlPiUNCiMgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCh2YXJpYWJsZSwgZXZlcnl0aGluZyguKSksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJwcmVjaW9fbWlfaWRlZV9nYXMueGxzeCIpDQoNCiMgZ3JhZl9taV9nYXMgPC0gcHJlY2lvX21pX2lkZWVfZ2FzICU+JSANCiMgICBzZWxlY3QoYW5pbywgcHJlY2lvX21pX2luZGV4YWRvX3Blc29zLCBwcmVjaW9fbWlfaW5kZXhhZG9fdXNkKSAlPiUgDQojICAgZ2F0aGVyKC4sDQojICAgICAgICAgIGtleSA9IHZhcmlhYmxlICwNCiMgICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiMgICAgICAgICAgMjozKSAlPiUNCiMgICBmaWx0ZXIodmFyaWFibGUgPT0icHJlY2lvX21pX2luZGV4YWRvX3VzZCIgKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB2YXJpYWJsZSkpKw0KIyAgIGdlb21fbGluZSgpDQojIGdyYWZfbWlfZ2FzDQoNCiMgcHJlY2lvX21pX2dhcyAlPiUgDQojICAgZmlsdGVyKGFuaW8gPiAyMDAwKSAlPiUgDQojICAgc2VsZWN0KGFuaW8sIHByZWNpb19nYXNfbWRvaW50LCBwcmVjaW9fbWlfbWVjb25fY2Nubl9nYXMpDQpgYGANCg0KPGJyPg0KKipUYWJsYSA0LiBQcmVjaW8gZGVsIG1lcmNhZG8gaW50ZXJubyBkZWwgZ2FzIG5hdHVyYWwgZW4gQXJnZW50aW5hIHNlZ8O6biBkaXN0aW50YXMgZnVlbnRlcyAoYmFycmlsZXMpKioNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcmVjaW9fbWlfZ2FzICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fZ2FzX21kb2ludCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3ByZWNpb19pbnRlcm5vX2dhc19tbWJ0dSA8LSBwcmVjaW9fbWlfZ2FzX01NQlRVICU+JQ0KICAjIHNlbGVjdCgtYyhkaWZfeXBmX2lkZWUsIHByZWNpb19nYXNfbWRvaW50KSkgJT4lIA0KICBzZWxlY3QoLWMoIHByZWNpb19nYXNfbWRvaW50KSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19wcmVjaW8sDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMzpuY29sKC4pKSAlPiUNCiBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IvIHRjYykgJT4lDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIE7CsDQuIFByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbC4NCiAgICAgICBBcmdlbnRpbmEgKDE5NjMgLSAyMDE4KSIsIA0KICAgICAgIHkgPSAiVVNEL01NQlRVIikNCmdncGxvdGx5KGdyYWZfcHJlY2lvX2ludGVybm9fZ2FzX21tYnR1LCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KYGBgDQoNCg0KIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBNZXJjYWRvIE11bmRpYWwNClByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIGRlc2RlIEFyZ2VudGluYSwgYmVuY2htYXJrcyB5IFByZWNpb3MgZGVsIG1lcmNhZG8gZGUgRUVVVSAoc29sbyBnYXMsIGludGVybm9zIHkgZGUgZXhwby9pbXBvKQ0KDQoqIFtTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYS1SZWdhbGlhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3JlZ2FsaWFzLWRlLXBldHJvbGVvLWNydWRvLWdhcy1uYXR1cmFsLWdscC1nYXNvbGluYS15LWNvbmRlbnNhZG8pKSAoMjAwNi1ob3kpDQoqIFtNRUNPTl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3ByZWNpby1kZS1leHBvcnRhY2lvbi1kZS1wZXRyb2xlby1jcnVkbykuIFNlcmllIGNvcnRhIHkgc2luIHRyYW5zZm9ybWFjaW9uZXMNCiogRUlBDQogICsgW0JyZW50XShodHRwczovL3d3dy5laWEuZ292L2RuYXYvcGV0L2hpc3QvUkJSVEVELmh0bSkgKDE5ODctaG95KQ0KICArIFtXVEldKGh0dHBzOi8vd3d3LmVpYS5nb3YvZG5hdi9wZXQvaGlzdC9yd3RjRC5odG0pICgxOTg2LWhveSkNCiAgKyBbSGVucnkgSHViXShodHRwczovL3d3dy5laWEuZ292L2RuYXYvbmcvaGlzdC9ybmd3aGhkZC5odG0pICgxOTk3LWhveSkNCiAgKyBbUHJlY2lvIEdhcyBkZSBCb2NhIGRlIFBvem8gZW4gRUVVVV0oaHR0cHM6Ly93d3cuZWlhLmdvdi9kbmF2L25nL2hpc3QvbjkxOTB1czNBLmh0bSkNCiogW0luZmxhdGlvbiBEYXRhXShodHRwczovL2luZmxhdGlvbmRhdGEuY29tL2FydGljbGVzL2luZmxhdGlvbi1hZGp1c3RlZC1wcmljZXMvaGlzdG9yaWNhbC1jcnVkZS1vaWwtcHJpY2VzLXRhYmxlLykgKDE5NDYtaG95KQ0KKiBbRXVyb3N0YXRdKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L3dlYi9lbmVyZ3kvZGF0YS9kYXRhYmFzZSkNCiogUmV2aXN0YSBJREVFICAgDQogICsgUHJlY2lvIGRlIEltcG9ydGFjacOzbiBkZSBnYXMgbmF0dXJhbCBkZXNkZSBCb2xpdmlhICgxOTcwLTE5ODgpDQoqIFtVTiBDb210cmFkZV0oaHR0cHM6Ly9jb210cmFkZS51bi5vcmcvZGF0YS8pDQogICsgUHJlY2lvIGRlIEV4cG9ydGFjacOzbiBlIEltcG9ydGFjacOzbiBkZSBnYXMgeSBjcnVkbyAoYSBCb2xpdmlhIHkgcHJvbWVkaW8gbXVuZGlhbCkNCiAgKyBFbCBwcmVjaW8gaW1wbyBib2xpdmlhIGRlICBVTiBDb210cmFkZSBjaWVycmEsIGRhIHZhbG9yZXMgY29oZXJlbnRlcyBwZXJvIG5vIGRlYmVyaWEsIGRhZG8gcXVlIGxhIGNvbnZlcnNpw7NuIGRlYmVyaWEgcmVhbGl6YXJzZSBtdWx0aXBsaWNhbmRvIGVsIHByZWNpbyBlbiBNbTMgcG9yIDEwMDAgeSBhaMOtIHJlY2nDqW4gcmVhbGl6YXIgbGEgY29udmVyc2nDs24NCiAgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBDcnVkbw0KKiBGdWVudGVzIHNlbGVjY2lvbmFkYXMgcGFyYSBwcmVjaW9fbWVfY3J1ZG86IA0KICArIGVudHJlIDE5NjIgeSAxOTkyOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoY2xhc2lmaWNhY2nDs24gU0lUQyBhcyByZXBvcnRlZCkNCiAgKyBlbnRyZSAxOTkzLTIwMDEgeSAyMDA0LTIwMTQ6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIE1lY29uDQogICsgZW50cmUgMjAwMiB5IDIwMDM6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gZGUgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlIChDbGFzaWZpY2FjacOzbiBIUyBhcyByZXBvcnRlZCkNCiAgKyAyMDE0IGVuIGFkZWxhbnRlOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoUmVnYWzDrWFzKQ0KICArIFZhbG9yZXMgZmFsdGFudGVzIHByZXZpb3MgYSAxOTkyICgxOTcwIC0gMTk4NSk6IEJyZW50IChGdWVudGU6IEluZmxhdGlvbiBEYXRhKQ0KDQoNCioqRmFsdGEgY29uc3RydWlyIHVuYSBwYXJpZGFkIGRlIGV4cG8vaW1wbyBjb24gZWwgZmxldGUqKg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0Jhc2UgcmVnYWxpYXMNCnByZWNpb19tZV9yZWdhbGlhc19jcnVkbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2V4dGVybm9fY3J1ZG9fcmVnYWxpYXMuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUNCiAgcmVuYW1lKGFuaW8gPSAiQcORTyIsDQogICAgICAgICBtZXMgPSAiTUVTIiwNCiAgICAgICAgIHRvdGFsX3RpcG9fY3J1ZG8gPSAiVE9UQUwgVElQTyBERSBDUlVETyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvbTMiLA0KICAgICAgICAgYW5pbyA9IG5hLmxvY2YoYW5pbykpICU+JQ0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIHRvdGFsX3RpcG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC1jKEJSRU5ULCBXVEkpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gInRpcG9fY3J1ZG8iLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgNTpuY29sKC4pKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIHN1bW1hcmlzZShwcmVjaW9fdG90YWxfdGlwb19jcnVkbyA9IG1lYW4odG90YWxfdGlwb19jcnVkbykpICU+JSANCiAgICAgICAgICAgICMgcHJlY2lvX3Byb21lZGlvX3RpcG9fY3J1ZG8gPSBtZWFuKHZhbG9yKSklPiUgDQogIG11dGF0ZSh0aXBvX3ByZWNpbyA9ICJtZXJjYWRvIGV4dGVybm8iLA0KICAgICAgICAgcHJlY2lvX3RvdGFsX3RpcG9fY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcChwcmVjaW9fdG90YWxfdGlwb19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIikNCg0KIyBNZWNvbiBNT0RJRklDQVIgDQpwcmVjaW9fZXhwb3J0YWNpb25fY3J1ZG8gPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9wcmVjaW8tZXhwb3J0YWNpb24tY3J1ZG8ueGxzeCIsIA0KICAgIHNraXAgPSAyKQ0KDQojSU5ERUMgQ29tRXgNCnByZWNpb19leHBvX2luZGVjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9JTkRFQy9Db21FeC9wcmVjaW9fYW51YWxfcHJvbWVkaW9fZXhwb19oaWRyb19pbmRlYy5jc3YiLCAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgICU+JSANCiAgbXV0YXRlKCBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSAqIFRDQywNCiAgICAgICAgICAgICAgICAgICAgICB1bmlkYWRfZ2FzID0gImFycy9NaWxlcyBkZSBtMyIJKQ0KICAjIG11dGF0ZShwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSBwcmVjaW9fZXhwb19nYXNfaW5kZWMgKiBUQ0MsIA0KICAjICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJVU0QvTWlsZXMgZGUgbTMiIH4gImFycy9NaWxlcyBkZSBtMyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSkNCg0KI1VOIENPTVRSQURFDQpleHBvX2NydWRvX3VuY29tdHJhZGVfaHMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL1VOIENvbXRyYWRlL2V4cG9fY3J1ZG9fdW5jb210cmFkZV9ocy5jc3YiKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfcHJlY2lvID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICB1bmlkYWRfdmFsb3IgPSAiVVNEIiwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICJiYXJyaWxlcyIpICU+JSANCiAgcmVuYW1lKGFuaW8gPSBQZXJpb2QsDQogICAgICAgICBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbyA9IGV4cG9fcHJlY2lvX2JibCwgDQogICAgICAgICBleHBvX3VzZF9jb210cmFkZV9jcnVkbyA9ICJUcmFkZSBWYWx1ZSAoVVMkKSIpDQoNCmV4cG9fY3J1ZG9fc2l0YyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvZXhwb19jcnVkb19zaXRjLmNzdiIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9wcmVjaW8gPSAiVVNEL2JhcnJpbGVzIiwNCiAgICAgICAgIHVuaWRhZF92YWxvciA9ICJVU0QiLA0KICAgICAgICAgdW5pZGFkX2NhbnRpZGFkID0gImJhcnJpbGVzIikgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCwNCiAgICAgICAgIHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8gPSBleHBvX3ByZWNpb19iYmwsIA0KICAgICAgICAgZXhwb191c2RfY29tdHJhZGVfY3J1ZG8gPSAiVHJhZGUgVmFsdWUgKFVTJCkiKQ0KDQojTWVyZ2UgYmFzZXMNCnByZWNpb19leHBvX2NydWRvIDwtIHByZWNpb19tZV9yZWdhbGlhc19jcnVkbyAlPiUgDQogIHJlbmFtZShwcmVjaW9fZXhwb19yZWdhbGlhc19jcnVkbyA9IHByZWNpb190b3RhbF90aXBvX2NydWRvKSAlPiUgDQogIHNlbGVjdCgtdGlwb19wcmVjaW8pICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2V4cG9fbWVjb25fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWVfdXNkX2JibCApKSAlPiUNCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2luZGVjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1jKHByZWNpb19leHBvX2dhc19pbmRlYywgdW5pZGFkX2dhcykpKSAlPiUNCiAgbGVmdF9qb2luKGV4cG9fY3J1ZG9fdW5jb210cmFkZV9ocyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fY3J1ZG9fc2l0YyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSkgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICAjIG11dGF0ZShwcmVjaW9fZXhwb19jcnVkbyA9IGNhc2Vfd2hlbihhbmlvIDwgMTk5MyB+IHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvICVpbiUgMTk5MzoyMDE0IH4gcHJlY2lvX2V4cG9fbWVjb25fY3J1ZG8sDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMjAxNCB+IHByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvKSkgJT4lIA0KICAjIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtVENDKQ0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pLCAtVENDKQ0KIyBwcmVjaW9fZXhwb19jcnVkbw0KDQpgYGANCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIFJlZmVyZW5jaWEgTWVyY2FkbyBFeHRlcm5vIENydWRvDQojQnJlbnQNCmJyZW50X2EgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL2JyZW50Lnhsc3giLCANCiAgICBza2lwID0gNCklPiUgIA0KICByZW5hbWUoYW5pbyA9IFllYXIsIGJyZW50X25vbWluYWwgPSBgTm9taW5hbCBQcmljZWAsIGJyZW50X2FkanVzdGVkID0gYEluZmxhdGlvbiBBZGp1c3RlZCBQcmljZWApICAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIiwNCiAgICAgICAgIGFuaW8gPSBhcy5kb3VibGUoYW5pbykpIA0KDQoNCmJyZW50X2RhaWx5ICA8LSAgcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL1JCUlRFZC54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lDQogIHJlbmFtZShmZWNoYSA9IERhdGUsIGJyZW50X3Nwb3QgPSBgRXVyb3BlIEJyZW50IFNwb3QgUHJpY2UgRk9CIChEb2xsYXJzIHBlciBCYXJyZWwpYCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9iYXJyaWxlcyIsDQogICAgICAgICBmZWNoYSA9IGFzLkRhdGUoZmVjaGEpLCANCiAgICAgICAgIGFuaW8gPSB5ZWFyKGZlY2hhKSkgDQoNCmJyZW50X0lFQSAgPC0gIGJyZW50X2RhaWx5ICU+JSANCiAgZ3JvdXBfYnkodW5pZGFkLCBhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShicmVudF9zcG90ID0gbWVhbihicmVudF9zcG90KSkNCg0KYnJlbnQgPC0gYnJlbnRfYSAlPiUNCiAgc2VsZWN0KC1icmVudF9hZGp1c3RlZCkgJT4lIA0KICBsZWZ0X2pvaW4oYnJlbnRfSUVBKSAlPiUgDQogICMgbXV0YXRlKGRpZiA9IGJyZW50X3Nwb3QvYnJlbnRfbm9taW5hbCAtIDEpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICByZW5hbWUoYnJlbnRfaWVhID0gYnJlbnRfc3BvdCwNCiAgICAgICAgIGJyZW50X2hpc3RvcmljID0gYnJlbnRfbm9taW5hbCkNCg0KI1dUSSANCnd0aV9FSUFfZGFpbHkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvUldUQ2QueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHd0aV9laWEgPSBgQ3VzaGluZywgT0sgV1RJIFNwb3QgUHJpY2UgRk9CIChEb2xsYXJzIHBlciBCYXJyZWwpYCApICU+JSANCiAgbXV0YXRlKG1lcyA9IG1vbnRoKERhdGUpLA0KICAgICAgICAgYW5pbyA9IHllYXIoRGF0ZSksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIikNCg0Kd3RpX0VJQSA8LSB3dGlfRUlBX2RhaWx5ICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfZWlhID0gbWVhbih3dGlfZWlhLCBuYS5ybSA9IFQpKQ0KDQp3dGlfZnJlZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvRlJFRC9XVElTUExDLmNzdiIpICAlPiUNCiAgcmVuYW1lKHd0aV9zcG90X3ByaWNlID0gV1RJU1BMQykgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoREFURSksDQogICAgICAgICB1bmlkYWQgPSAiVVNEL2JhcnJpbGVzIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHd0aV9zcG90X3ByaWNlX2ZyZWQgPSBtZWFuKHd0aV9zcG90X3ByaWNlKSkNCiAgDQp3dGlfcmV0ZW5jaW9uXzA0IDwtIHd0aV9FSUFfZGFpbHkgICU+JSANCiAgZmlsdGVyKGFuaW8gPiAyMDAzICkgJT4lIA0KICBncm91cF9ieShhbmlvLCBtZXMpICU+JSANCiAgc3VtbWFyaXNlKHd0aSA9IG1lYW4od3RpX2VpYSkpICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbih3dGkgPCAzMiB+IDAuMjUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDMyICYgd3RpIDwgMzQuOTkgfiAwLjI4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSAzNSAmIHd0aSA8IDM2Ljk5IH4gMC4zMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gMzcgJiB3dGkgPCAzOC45OSB+IDAuMzQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDM5ICYgd3RpIDwgNDAuOTkgfiAwLjM3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHd0aSA+PSA0MSAmIHd0aSA8IDQyLjk5IH4gMC40MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3dGkgPj0gNDMgJiB3dGkgPCA0NC45OSB+IDAuNDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpID49IDQ1IH4gMC40NSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UocmV0ZW5jaW9uID0gbWVhbihyZXRlbmNpb24pKQ0KDQoNCnd0aV9yZXRlbmNpb25fMDcgPC0gd3RpX0VJQV9kYWlseSAlPiUgDQogIGZpbHRlcihhbmlvICVpbiUgYyggMjAwNzoyMDE0KSwgRGF0ZSA+ICIyMDA3LTExLTAyIiApICU+JSANCiAgbXV0YXRlKHJldGVuY2lvbiA9IGNhc2Vfd2hlbih3dGlfZWlhID49IDYwLjkgfiAod3RpX2VpYSAtIDQyKS80MiAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3RpX2VpYSA8IDYwLjkgfiAwLjQ1KSkgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZSh3dGlfZWlhID0gbWVhbih3dGlfZWlhKSwNCiAgICAgICAgICAgIHJldGVuY2lvbiA9ICBtZWFuKHJldGVuY2lvbikpDQoNCmJyZW50X3JlbnRlbmNpb25fMTQgPC0gIGJyZW50X2RhaWx5ICU+JQ0KICAgZmlsdGVyKGFuaW8gJWluJSBjKCAyMDE0OjIwMTUpLCBmZWNoYSA+ICIyMDA3LTExLTAyIiApICU+JQ0KICBtdXRhdGUocmV0ZW5jaW9uID0gY2FzZV93aGVuKGJyZW50X3Nwb3QgPj0gNzEgfiAoYnJlbnRfc3BvdCAtIDcwKS83MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVudF9zcG90IDwgNzEgfiAwLjAxKSkgJT4lIA0KICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoYnJlbnRfc3BvdCA9IG1lYW4oYnJlbnRfc3BvdCksDQogICAgICAgICAgICByZXRlbmNpb24gPSAgbWVhbihyZXRlbmNpb24pKQ0KICANCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUHJlY2lvIGRlIGV4cG9ydGFjaW9uIHkgcmVmZXJlbmNpYS4gTWVyZ2UgZGUgYmFzZXMNCnByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gPC0gIHByZWNpb19leHBvX2NydWRvICAlPiUgICANCiAgZnVsbF9qb2luKGJyZW50ICklPiUgI3NlbGVjdCgtZGlmKSkgJT4lIA0KICBsZWZ0X2pvaW4od3RpX0VJQSApICU+JSANCiAgZnVsbF9qb2luKHd0aV9mcmVkKSAlPiUgDQogIG11dGF0ZShwcmVjaW9fZXhwb19jcnVkb19pbmRlYyA9IGNhc2Vfd2hlbihwcmVjaW9fZXhwb19jcnVkb19pbmRlYyA+IDMwMCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHByZWNpb19leHBvX2NydWRvX2luZGVjKSwNCiAgICAgICAgIHByZWNpb19tZV9jcnVkbyA9IGNhc2Vfd2hlbihhbmlvICVpbiUgMTk5MzoyMDAxIHwgYW5pbyAlaW4lIDIwMDQ6MjAxNCB+IHByZWNpb19leHBvX21lY29uX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gJWluJSAyMDAyOjIwMDMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9oc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID4gMjAxNCB+IHByZWNpb19leHBvX3JlZ2FsaWFzX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKHByZWNpb19leHBvX2NvbXRyYWRlX3NpdGNfY3J1ZG8pIH4gYnJlbnRfaGlzdG9yaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA8IDE5OTMgfiBwcmVjaW9fZXhwb19jb210cmFkZV9zaXRjX2NydWRvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fbWVfY3J1ZG8sIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIGZpbHRlcihhbmlvIDwgMjAyMSkNCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbywgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL3ByZWNpb19leHBvX3lfbWRvX211bmRpYWxfY3J1ZG8ueGxzeCIpDQpwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fbWVfY3J1ZG8pDQoNCg0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfY3J1ZG8gPC0gcHJlY2lvc19yZWZlcmVuY2lhX3lfZXhwb19jcnVkbyAlPiUgDQogIHNlbGVjdCgtcHJlY2lvX21lX2NydWRvKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3ByZWNpbywNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOm5jb2woLikpICU+JQ0KICAjIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwgInByZWNpb19pbXBvX2dhc19ib2xpdmlhX01NQlRVX2NvbXRyYWRlIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWNpb19leHBvX2dhc19jb210cmFkZSIsICJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JQ0KICAjIGZpbHRlcihhbmlvICE9IDIwMDIgJiB0aXBvX3ByZWNpbyAhPSAicHJlY2lvX2V4cG9fY3J1ZG9faW5kZWMiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuOSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUHJlY2lvcyBkZSBleHBvcnRhY2nDs24geSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIG11bmRpYWwgZGVsIGNydWRvIiwgDQogICAgICAgeSA9ICJVU0QvYmFycmlsZXMiKQ0KDQpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9jcnVkbywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQoNCiMjIyMgUHJlY2lvcyBkZSBSZWZlcmVuY2lhIGRlbCBHYXMNCg0KKiBDcml0ZXJpbyBkZSBwcmVjaW9fZXh0ZXJub19nYXM6DQogICsgQcOxb3MgMTk2NCB5IDE5NjU6IFByZWNpbyBkZSBpbXBvcnRhY2nDs24gZGUgZ2FzIHByb3ZlbmllbnRlIGRlIEJvbGl2aWEgaGFjaWEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgMTk2NiBlbiBhZGVsYW50ZTogUHJlY2lvIGRlIGV4cG9ydGFjaW9uIGRlIGdhcyBkZXNkZSBCb2xpdmlhIGEgQXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIHByZXZpb3MgYSAxOTYzIHkgcGVyw61vZG8gMTk2OC0xOTcxDQoNCiMjIyMjIEV4cG9ydGFjacOzbiBBcmdlbnRpbmENCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMjIyBQcmVjaW8gZGUgRXhwb3J0YWNpw7NuIGRlbCBHYXMgDQojcmVnYWxpYXMNCnByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1JlZ2FsaWFzL3ByZWNpb19tZXJjYWRvX2V4dGVybm9fZ2FzX3JlZ2FsaWFzLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lDQogICByZW5hbWUoYW5pbyA9ICJBw5FPIiwNCiAgICAgICAgIG1lcyA9ICJNRVMiLA0KICAgICAgICAgdG90YWxfY3VlbmNhID0gIlRPVEFMIENVRU5DQSIpICU+JSANCiAgIG11dGF0ZSh1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIiwNCiAgICAgICAgICBhbmlvID0gbmEubG9jZihhbmlvKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgbWVzLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSAiY3VlbmNhIiwNCiAgICAgICAgIHZhbHVlID0gInZhbG9yIiwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGN1ZW5jYSkgJT4lDQogIG11dGF0ZSh2YWxvciA9IGdzdWIoIiwiLCAiIiwgdmFsb3IpLA0KICAgICAgICAgdmFsb3IgPSBhcy5kb3VibGUodmFsb3IpKSAlPiUgIA0KICBzdW1tYXJpc2UocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gbWVhbih2YWxvciwgbmEucm0gPSBUKSkgJT4lIA0KICBtdXRhdGUodGlwb19wcmVjaW8gPSAibWVyY2FkbyBleHRlcm5vIikgJT4lDQogIGZpbHRlcihjdWVuY2EgPT0gInRvdGFsX2N1ZW5jYSIpJT4lDQogIGFycmFuZ2UoYW5pbykNCg0KI2NvbXRyYWRlDQpleHBvX2dhc19jb210cmFkZSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9leHBvX2dhc19zaXRjLmNzdiIpICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUoZXhwb19wcmVjaW9fTU1CVFUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKGV4cG9fcHJlY2lvX01tMyApLA0KICAgICAgICAgZXhwb19wcmVjaW9fTW0zX2FycyA9IGV4cG9fcHJlY2lvX01tMyAqIHRjYykgDQoNCiNtZXJnZSBkZSBiYXNlcw0KI3ByZWNpbyBlbiBwZXNvcw0KcHJlY2lvX2V4cG9fZ2FzIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01tM19hcnMpICU+JSANCiAgZnVsbF9qb2luKHByZWNpb19leHBvX3JlZ2FsaWFzX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdCgtYyhjdWVuY2EsIHRpcG9fcHJlY2lvKSkpICU+JQ0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9faW5kZWMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfZ2FzLCBwcmVjaW9fZXhwb19nYXNfaW5kZWMpICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCEoaXMubmEocHJlY2lvX2V4cG9fZ2FzX2luZGVjKSkpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHBvX2dhc19tZWNvbiA9IHByZWNpb19nYXNfbWVfcGVzb3NfTW0zKSkNCg0KDQojcHJlY2lvcyBlbiBkb2xhcmVzDQpwcmVjaW9fZXhwb19nYXNfdXNkIDwtIGV4cG9fZ2FzX2NvbXRyYWRlICAlPiUgIA0KICBzZWxlY3QoYW5pbywgIHByZWNpb19leHBvX2dhc19jb210cmFkZSA9IGV4cG9fcHJlY2lvX01NQlRVKSAlPiUNCiAgbGVmdF9qb2luKCBwcmVjaW9fZXhwb19nYXMgJT4lIHNlbGVjdCgtYyhwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUsIHVuaWRhZCkpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsICU+JSBzZWxlY3QoLVRDUCkpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzID0gKHByZWNpb19leHBvX2dhc19yZWdhbGlhcy8xMDAwKSAvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfaW5kZWMgPSAocHJlY2lvX2V4cG9fZ2FzX2luZGVjICkvIFRDQywgDQogICAgICAgICBwcmVjaW9fZXhwb19nYXNfbWVjb24gPSAocHJlY2lvX2V4cG9fZ2FzX21lY29uLzEwMDApLyBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICBtdXRhdGVfYXQoLnZhcnMgPSBjKCJwcmVjaW9fZXhwb19nYXNfcmVnYWxpYXMiLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIiwgInByZWNpb19leHBvX2dhc19tZWNvbiIpLA0KICAgICAgICAgICAgLmZ1bnMgPSBjb252ZXJzb3JfbTNNTUJUVV9wKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLiksLVRDQykNCg0KDQpgYGANCg0KIyMjIyMgUmVmZXJlbmNpYXMgbXVuZGlhbGVzDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgUHJlY2lvIFJlZmVyZW5jaWEgTWVyY2FkbyBFeHRlcm5vIEdhcyANCiMjIyMgUHJlY2lvcyBNdW5kaWFsZXMNCiNoZW5yeV9odWIgRUlBDQpoZW5yeV9odWIgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9QcmVjaW9zL1JOR1dISERkLnhscyIsIA0KICAgIHNoZWV0ID0gIkRhdGEgMSIsIHNraXAgPSAyKSAlPiUgDQogIHJlbmFtZSggZGF0ZSA9IERhdGUsDQogICAgaGVucnlfaHViX3Nwb3QgPSBgSGVucnkgSHViIE5hdHVyYWwgR2FzIFNwb3QgUHJpY2UgKERvbGxhcnMgcGVyIE1pbGxpb24gQnR1KWApICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvTU1CVFUiLA0KICAgICAgICAgYW5pbyA9IHllYXIoZGF0ZSkpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShlaWFfaGVucnlfaHViX3Nwb3QgPSBtZWFuKGhlbnJ5X2h1Yl9zcG90LCBuYS5ybSA9IFQpKSANCg0KaGVucnlfaHViX2FycyA8LSAgaGVucnlfaHViICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBUQ0MpKSAlPiUgDQogIG11dGF0ZShoZW5yeV9odWJfc3BvdCA9IGNvbnZlcnNvcl9NTUJUVW0zZ2FzX3AoZWlhX2hlbnJ5X2h1Yl9zcG90ICoxMDAwKlRDQyksDQogICAgICAgICB1bmlkYWQ9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQojIFByZWNpbyBVU0EgYm9jYSBkZSBwb3pvIEVJQSAgICAgICAgICB1bmlkYWQgPSAiVVNEL2Z0MyINCndlbGxoZWFkX3ByaWNlX2VldXUgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvRUlBL2RhdGEvbmF0dXJhbF9nYXNfd2VsbGhlYWRfcHJpY2VfZWV1dS54bHMiLCANCiAgICBzaGVldCA9ICJEYXRhIDEiLCBza2lwID0gMikgJT4lIA0KICByZW5hbWUodXNfd2VsbGhlYWRfcHJpY2VfZnQzID0gIlUuUy4gTmF0dXJhbCBHYXMgV2VsbGhlYWQgUHJpY2UgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpIikgJT4lICANCiAgbXV0YXRlKCB1c193ZWxsaGVhZF9wcmljZV9NbTMgPSBjb252ZXJzb3JfZnQzbTNfcCh1c193ZWxsaGVhZF9wcmljZV9mdDMqMTAwMCksDQogICAgICAgICAgdXNfd2VsbGhlYWRfcHJpY2VfTU1CVFUgPSBjb252ZXJzb3JfZnQzTU1CVFVfcCh1c193ZWxsaGVhZF9wcmljZV9mdDMvMTAwMCksDQogICAgICAgICAgYW5pbyA9IHllYXIoRGF0ZSksDQogICAgICAgICB1bmlkYWQgID0gIlVTRCIpIA0KDQojb3Ryb3MgcHJlY2lvcyBkZSBVU0EgRUlBDQpwcmljZV9lZXV1IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0VJQS9kYXRhL25hdHVyYWxfZ2FzX3ByaWNlc191c2EueGxzIiwgDQogICAgc2hlZXQgPSAiRGF0YSAxIiwgc2tpcCA9IDIpICU+JSANCiAgcmVuYW1lKHVzX3dlbGxoZWFkX2dhc19wcmljZSA9IGBVLlMuIE5hdHVyYWwgR2FzIFdlbGxoZWFkIFByaWNlIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19pbXBvcnRfZ2FzX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgSW1wb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfcGlwZWxpbmVfaW1wb3J0X3ByaWNlID0gYFUuUy4gTmF0dXJhbCBHYXMgUGlwZWxpbmUgSW1wb3J0cyBQcmljZSAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfbG5nX2ltcG9ydF9wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIExORyBJbXBvcnRzIChEb2xsYXJzIHBlciBUaG91c2FuZCBDdWJpYyBGZWV0KWAsDQogICAgICAgICB1c19leHBvcnRfZ2FzX3ByaWNlID0gYFByaWNlIG9mIFUuUy4gTmF0dXJhbCBHYXMgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgLA0KICAgICAgICAgdXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSA9IGBQcmljZSBvZiBVLlMuIE5hdHVyYWwgR2FzIFBpcGVsaW5lIEV4cG9ydHMgKERvbGxhcnMgcGVyIFRob3VzYW5kIEN1YmljIEZlZXQpYCwNCiAgICAgICAgIHVzX2V4cG9ydF9sbmdfcHJpY2UgPSBgUHJpY2Ugb2YgTGlxdWVmaWVkIFUuUy4gTmF0dXJhbCBHYXMgRXhwb3J0cyAoRG9sbGFycyBwZXIgVGhvdXNhbmQgQ3ViaWMgRmVldClgKSAlPiUgDQogIHNlbGVjdCh1c193ZWxsaGVhZF9nYXNfcHJpY2UsIHVzX2ltcG9ydF9nYXNfcHJpY2UsIHVzX3BpcGVsaW5lX2ltcG9ydF9wcmljZSwNCiAgICAgICAgdXNfbG5nX2ltcG9ydF9wcmljZSwgdXNfZXhwb3J0X2dhc19wcmljZSwNCiAgICAgICAgdXNfZXhwb3J0X2dhc19waXBlbGluZV9wcmljZSwgdXNfZXhwb3J0X2xuZ19wcmljZSApICU+JSANCiAgbXV0YXRlKGFuaW8gPSAxOTIyOjIwMTkpDQogIA0KDQpwcmljZV9lZXV1X01tMyA8LSAgcHJpY2VfZWV1dSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCl7Y29udmVyc29yX2Z0M20zX3AoIDEwMDApfSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDE5MjI6MjAxOSwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTWlsZXMgZGUgbTMiKSANCg0KcHJpY2VfZWV1dV9NTUJUVSA8LSAgcHJpY2VfZWV1dSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCl7Y29udmVyc29yX2Z0M01NQlRVX3AoeCAvMTAwMCl9KSAlPiUgDQogIG11dGF0ZShhbmlvID0gMTkyMjoyMDE5LA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpICAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV2ZXJ5dGhpbmcoLikpDQogIA0KDQojZXVyb3N0YXQNCg0KDQojQlANCmJwX2dhc19wcmljZXMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvQlAvYnAtc3RhdHMtcmV2aWV3LTIwMjAtYWxsLWRhdGEueGxzeCIsIA0KICAgIHNoZWV0ID0gIkdhcyAtIFByaWNlcyAiLCBza2lwID0gMykgJT4lIA0KICByZW5hbWUoYW5pbyA9IC4uLjEsIA0KICAgICAgICAgYnBfbG5nX2phcGFuX2NpZiA9IEphcGFuLA0KICAgICAgICAgYnBfbG5nX2prbSA9ICJKYXBhbiBLb3JlYSBNYXJrZXIiLA0KICAgICAgICAgYnBfZ2FzX2dlcm1hbl9pbXBvcnRfcHJpY2UgPSAiQXZlcmFnZSBHZXJtYW4iLA0KICAgICAgICAgYnBfZ2FzX25icCA9IFVLLA0KICAgICAgICAgYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiA9ICJOZXRoZXJsYW5kcyBUVEYiLA0KICAgICAgICAgYnBfZ2FzX2hlbnJ5X2h1YiA9IFVTLA0KICAgICAgICAgYnBfZ2FzX2NhbmFkYSA9IENhbmFkYSwgDQogICAgICAgICBicF9vaWxfbWl4X21lYW5fb2VjZCA9IE9FQ0QpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpICU+JSANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NTUJUVSIpDQoNCmJwX2dhc18yMDE2IDwtIGJwX2dhc19wcmljZXMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgYnBfbG5nX2prbSwgYnBfZ2FzX2hlbnJ5X2h1YiwgYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiApICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGFuaW8gPT0gMjAxNikNCg0KDQojRk1JDQpmbWlfcHJpY2VzIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9GTUkvUENQU18wOS0xNi0yMDIwIDE1LTA3LTEwLTY2X3RpbWVTZXJpZXMuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMzggPSBjb2xfc2tpcCgpKSkNCg0KZm1pX2dhc19wcmljZSA8LSBmbWlfcHJpY2VzICU+JSANCiAgZmlsdGVyKGBDb21tb2RpdHkgTmFtZWAgJWluJSBjKCJOYXR1cmFsIGdhcywgRVUiLCJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIsIkxORywgQXNpYSIgICksDQogICAgICAgICBgVW5pdCBOYW1lYCA9PSAiSW5kZXgiKSAlPiUgDQogIHJlbmFtZShjb21tb2RpdHkgPSAiQ29tbW9kaXR5IE5hbWUiLA0KICAgICAgICAgdW5pZGFkID0gIlVuaXQgTmFtZSIpICU+JSANCiAgZ2F0aGVyKC4sDQogICAgICAgICBrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgIDg6bmNvbCguKSkgJT4lIA0KICBzZWxlY3QoY29tbW9kaXR5LCBhbmlvLCB2YWxvciwgdW5pZGFkICkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwMCwNCiAgICAgICAgIGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgc3ByZWFkKC4sDQogICAgICAgICBrZXkgPSBjb21tb2RpdHksIA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikgJT4lIA0KICByZW5hbWUoZm1pX2xuZ19hc2lhID0gIkxORywgQXNpYSIsDQogICAgICAgICBmbWlfbmF0dXJhbF9nYXNfZXUgPSJOYXR1cmFsIGdhcywgRVUiLA0KICAgICAgICAgZm1pX2hlbnJ5X2h1YiA9ICJOYXR1cmFsIEdhcywgVVMgSGVucnkgSHViIEdhcyIpICU+JSANCiAgbXV0YXRlKGZtaV9sbmdfYXNpYSA9IGZtaV9sbmdfYXNpYSAqIGJwX2dhc18yMDE2JGJwX2xuZ19qa20sDQogICAgICAgICBmbWlfaGVucnlfaHViID0gIGZtaV9oZW5yeV9odWIgKiBicF9nYXNfMjAxNiRicF9nYXNfaGVucnlfaHViLA0KICAgICAgICAgZm1pX25hdHVyYWxfZ2FzX2V1ID0gZm1pX25hdHVyYWxfZ2FzX2V1ICogYnBfZ2FzXzIwMTYkYnBfZ2FzX25ldGhlcmxhbmRzX3R0ZiwNCiAgICAgICAgIHVuaWRhZCA9ICJVU0QvTU1CVFUiKQ0KDQoNCiMgdW5pcXVlKGZtaV9wcmljZXMkYENvbW1vZGl0eSBOYW1lYCkNCiMgdW5pcXVlKGZtaV9wcmljZXMkYFVuaXQgTmFtZWApDQojIHVuaXF1ZShmbWlfcHJpY2VzJGBDb3VudHJ5IE5hbWVgKQ0KYGBgDQoNCg0KIyMjIyMgQm9saXZpYQ0KIA0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIyMjIyBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIEJvbGl2aWENCiNQcmVjaW8gaW1wbyBib2xpdmlhIHJldmlzdGEgSURFRQ0KcHJlY2lvX2lkZWVfaW1wb19nYXMgPC0gY3VhZHJvXzQuMyAgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2dhcywgcHJlY2lvX2dhc19ib2xpdmlhKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfNzApKSAlPiUNCiAgbXV0YXRlKHByZWNpb19nYXNfYm9saXZpYV9pZGVlID0gcHJlY2lvX2dhc19ib2xpdmlhICogaXBjXzcwIC8gY29udmVyc29yX3Blc29zJGAkTGV5YCwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMvTWlsZXMgZGUgbTMiKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgc2VsZWN0KGFuaW8sIHRjYykpICU+JSANCiAgbXV0YXRlKHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSA9IHByZWNpb19nYXNfYm9saXZpYV9pZGVlIC90Y2MpDQoNCg0KI3ByZWNpbyBCb2xpdmlhIFlQRkIgZW4gVVNEIChvcmlnaW5hbCkNCiMgYSBtMw0KcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfeXBmYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX2V4cG9fYm9saXZpYS54bHN4IikgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyIsICJwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMiKSwNCiAgICAgICAgICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9mdDNtM19wKHgpfSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIlVTRC9NaWxlcyBkZSBtMyIpDQoNCg0KIyBhIE1NIEJUVQ0KcHJlY2lvX2V4cG9fYm9saXZpYV91c2RfTU1CVFVfeXBmYiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1ByZWNpb3MvcHJlY2lvX2V4cG9fYm9saXZpYS54bHN4IikgJT4lDQogIG11dGF0ZV9hdCgudmFycyA9IGMoInByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcyIsICJwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMiKSwNCiAgICAgICAgICAgIC5mdW5zID0gZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9mdDNNTUJUVV9wKHgvMTAwMCl9KSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL01NQlRVIikgJT4lIA0KICByZW5hbWUocHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfeXBmYiA9IHByZWNpb19leHBvX2JvbGl2aWFfYXJnX2dhcywNCiAgICAgICAgIHByZWNpb19leHBvX2JvbGl2aWFfYnpsX3lwZmIgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMpICANCg0KDQojcHJlY2lvIGJvbGl2aWEgZW4gcGVzb3MgDQojc3VtYXJsZSBlbCBmbGV0ZSA9IDAuMDI0MTI5Nzk0DQpwcmVjaW9fZXhwb19ib2xpdmlhX3Blc29zX3lwZmIgPC0gIHByZWNpb19leHBvX2JvbGl2aWFfdXNkX3lwZmIgJT4lIA0KICAgIGxlZnRfam9pbih0Y3BfYW51YWwpICU+JQ0KICBtdXRhdGUocHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzX3Blc29zID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzICogVENDICwgDQogICAgICAgICBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXNfcGVzb3MgPSBwcmVjaW9fZXhwb19ib2xpdmlhX2J6bF9nYXMgKiBUQ0MsDQogICAgICAgICB1bmlkYWQgPSAiYXJzL01pbGVzIGRlIG0zIikNCg0KDQojcHJlY2lvIGltcG8gZGUgYXJnZW50aW5hIGRlc2RlIGJvbGl2aWEgVU4gQ29tdHJhZGUNCmdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGVfdXNkIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2dhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUuY3N2IikgJT4lDQogIHNlbGVjdChQZXJpb2QsICJUcmFkZSBGbG93IiwgUmVwb3J0ZXIsIFBhcnRuZXIsICJDb21tb2RpdHkgQ29kZSIsIENvbW1vZGl0eSwNCiAgICAgICAgIFF0eSwgdHJhZGVfdmFsdWVfdXNkLCBwcmVjaW9faW1wb19nYXNfYm9saXZpYSwgdW5pZGFkX3ByZWNpbywgdW5pZGFkX2NhbnRpZGFkKSAlPiUgDQogIHJlbmFtZShhbmlvID0gUGVyaW9kKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpDQoNCiNwYXNhamUgYSBwZXNvcw0KZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZSA8LSBnYXNfaW1wb19ib2xpdmlhX2NvbXRyYWRlX3VzZCAgJT4lIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShwcmVjaW9faW1wb19nYXNfYm9saXZpYSA9IHByZWNpb19pbXBvX2dhc19ib2xpdmlhICogdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJhcnMvTWlsZXMgZGUgbTMiKQ0KDQoNCiNwcmVjaW8gZXhwbyBib2xpdmlhIFVOIENPTVRSQURFDQpnYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlX3VzZCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvVU4gQ29tdHJhZGUvcmVzdWx0YWRvcy9nYXNfZXhwb19ib2xpdmlhX2NvbXRyYWRlLmNzdiIpICU+JQ0KICBzZWxlY3QoUGVyaW9kLCAiVHJhZGUgRmxvdyIsIFJlcG9ydGVyLCBQYXJ0bmVyLCAiQ29tbW9kaXR5IENvZGUiLCBDb21tb2RpdHksDQogICAgICAgICBRdHksIHRyYWRlX3ZhbHVlX3VzZCwgcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEsIHVuaWRhZF9wcmVjaW8sIHVuaWRhZF9jYW50aWRhZCkgJT4lIA0KICByZW5hbWUoYW5pbyA9IFBlcmlvZCkgJT4lIA0KICAgbXV0YXRlKHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19NTUJUVV9jb210cmFkZSA9IGNvbnZlcnNvcl9tM01NQlRVX3AocHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEpLA0KICAgICAgICAgdW5pZGFkID0gIlVTRC9NTUJUVSIpDQoNCiNwYXNhamUgYSBwZXNvcw0KZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZSA8LSAgZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHByZWNpb19leHBvX2dhc19ib2xpdmlhID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgKiB0Y2MsDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gImFycy9NaWxlcyBkZSBtMyIpDQpgYGANCg0KIyMjIyMgVG9kb3MgbG9zIHByZWNpb3MNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojUHJlY2lvIGRlIGV4cG9ydGFjaW9uIHkgcmVmZXJlbmNpYSBkZSBHYXMuIE1lcmdlIGRlIGJhc2VzDQoNCiNwcmVjaW9zIGVuIHVzZA0KcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVIDwtIHByaWNlX2VldXVfTU1CVFUgJT4lIA0KICBsZWZ0X2pvaW4oICBoZW5yeV9odWIpICU+JQ0KICBsZWZ0X2pvaW4oYnBfZ2FzX3ByaWNlcykgJT4lIA0KICBsZWZ0X2pvaW4oZm1pX2dhc19wcmljZSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2V4cG9fYm9saXZpYV91c2RfTU1CVFVfeXBmYikgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2ltcG9fYm9saXZpYV9jb210cmFkZV91c2QgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUgPSBwcmVjaW9faW1wb19nYXNfYm9saXZpYV9NTUJUVV9jb210cmFkZSkpICU+JSANCiAgbGVmdF9qb2luKGdhc19leHBvX2JvbGl2aWFfY29tdHJhZGVfdXNkICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfY29tdHJhZGUgPSBwcmVjaW9fZXhwb19nYXNfYm9saXZpYV9hcmdfTU1CVFVfY29tdHJhZGUpKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9faWRlZV9pbXBvX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZSkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19leHBvX2dhc191c2QpICU+JSANCiAgbXV0YXRlKHByZWNpb19pbXBvX2dhc19ib2xpdmlhX2lkZWUgPSBjb252ZXJzb3JfbTNNTUJUVV9wKHByZWNpb19nYXNfYm9saXZpYV91c2RfaWRlZS8xMDAwKSwjb2sNCiAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IGNhc2Vfd2hlbiggYW5pbyA8IDE5NjYgfiBwcmVjaW9faW1wb19nYXNfYXJnX2JvbGl2aWFfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR+IHByZWNpb19leHBvX2dhc19ib2xpdmlhX2FyZ19jb210cmFkZSksDQogICAgICAgICBwcmVjaW9fZXhwb3J0YWNpb25fZ2FzX2FyID0gY2FzZV93aGVuKGFuaW8gPDE5OTkgfnByZWNpb19leHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk5IH4gcHJlY2lvX2V4cG9fZ2FzX3JlZ2FsaWFzKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMsIGV2ZXJ5dGhpbmcoLiksIC1wcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUpICU+JSANCiAgZmlsdGVyKGFuaW8gPCAyMDIxKQ0KDQpwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiAgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICBtdXRhdGVfYWxsKGNvbnZlcnNvcl9NTUJUVWJlcF9wKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JlcCIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXZlcnl0aGluZyguKSkNCg0KY29tcGFyYWNpb25fYmVwIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19iZXAgJT4lIA0KICAgICMgc2VsZWN0KGFuaW8sIHByZWNpb19leHRlcm5vX2dhcykgJT4lDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGJyZW50X2hpc3RvcmljLCB3dGlfc3BvdF9wcmljZV9mcmVkLA0KICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9fY29tdHJhZGVfc2l0Y19jcnVkbykpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QvYmVwIikNCiAgDQojIHByZWNpb19tZG9tdW5kaWFsX2dhc19NbTMgPC0gcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JQ0KIyAgIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQojICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KIyAgIG11dGF0ZV9hbGwoY29udmVyc29yX20zTU1CVFVfcCkgJT4lIA0KIyAgIG11dGF0ZSh1bmlkYWQgPSAiVVNEL2JlcCIpICU+JSANCiMgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBldmVyeXRoaW5nKC4pKQ0KICANCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoTU1CVFUgPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgQkVQID0gcHJlY2lvX21kb211bmRpYWxfZ2FzX2JlcCksIHBhdGggPSAicmVzdWx0YWRvcy9wcmVjaW9fbWRvX211bmRpYWxfZ2FzLnhsc3giKQ0KDQojZ3JhZmljbyBwcmVjaW9zIGJlcA0KZ3JhZl9wcmVjaW9fbWRvX211bmRpYWxfZ2FzX2JlcCA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgc2VsZWN0KC1wcmVjaW9fZXh0ZXJub19nYXMpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZ2FzX2JvbGl2aWFfdXNkX2lkZWUiLCAicHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWFfTU1CVFVfY29tdHJhZGUiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlY2lvX2V4cG9fZ2FzX2NvbXRyYWRlIiwgInByZWNpb19leHBvX2dhc19pbmRlYyIpKSkgJT4lDQogIGZpbHRlcighKHRpcG9fcHJlY2lvICVpbiUgYygicHJlY2lvX2V4cG9fZ2FzX2luZGVjIikpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGFuaW8sIHkgPSB2YWxvciwgY29sb3IgPSB0aXBvX3ByZWNpbykpKw0KICBnZW9tX2xpbmUoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh5ID0gIlVTRC9iZXAiKQ0KIyBwbG90bHk6OmdncGxvdGx5KGdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19iZXApDQoNCmdyYWZfcHJlY2lvX21kb19tdW5kaWFsX2dhc19tbWJ0dSA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUgJT4lIA0KICBmaWx0ZXIocHJlY2lvX2V4dGVybm9fZ2FzIDwgMjUpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6bmNvbCguKSkgJT4lDQogIGZpbHRlcigNCiAgICB2YWxvciA8IDI1LA0KICAgICEodGlwb19wcmVjaW8gJWluJSBjKCJicF9vaWxfbWl4X21lYW5fb2VjZCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLCAicHJlY2lvX2V4cG9fZ2FzX2luZGVjIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAicHJlY2lvX2dhc19ib2xpdmlhX3VzZF9pZGVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInByZWNpb19pbXBvX2dhc19hcmdfYm9saXZpYV9jb210cmFkZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJwcmVjaW9fZXhwb19nYXNfY29tdHJhZGUiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkgJT4lDQogICMgZmlsdGVyKCEodGlwb19wcmVjaW8gJWluJSBjKCJwcmVjaW9fZXhwb19nYXNfaW5kZWMiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYW5pbywgeSA9IHZhbG9yLCBjb2xvciA9IHRpcG9fcHJlY2lvKSkrDQogIGdlb21fbGluZSgpICsNCiAgIyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKw0KICBsYWJzKHRpdGxlID0gIlByZWNpb3MgZGUgZXhwb3J0YWNpw7NuIHkgcmVmZXJlbmNpYSBkZWwgbWVyY2FkbyBtdW5kaWFsIGRlbCBnYXMiLCANCiAgICAgICB5ID0gIlVTRC9NTUJUVSIpDQpnZ3Bsb3RseShncmFmX3ByZWNpb19tZG9fbXVuZGlhbF9nYXNfbW1idHUsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KI3ByZWNpb3MgZW4gYXJzLiBJTkNPTVBMRVRPDQpwcmVjaW9fZXhwb195X21lX2dhcyA8LSBwcmVjaW9fZXhwb19nYXMgJT4lDQogIGZ1bGxfam9pbihwcmVjaW9faWRlZV9pbXBvX2dhcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19nYXNfYm9saXZpYV9pZGVlKSkgJT4lIA0KICBmdWxsX2pvaW4ocHJlY2lvX2V4cG9fYm9saXZpYV9wZXNvc195cGZiICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgDQogICAgICAgICAgICAgICAgICAgICBwcmVjaW9fYm9saXZpYV95cGZiID0gcHJlY2lvX2V4cG9fYm9saXZpYV9hcmdfZ2FzX3Blc29zICkpICU+JSANCiAgZnVsbF9qb2luKGdhc19pbXBvX2JvbGl2aWFfY29tdHJhZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3ByZWNpbywNCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbXBvX2dhc19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2ltcG9fZ2FzX2JvbGl2aWEgKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FzX2V4cG9fYm9saXZpYV9jb210cmFkZSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfcHJlY2lvLCANCiAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHBvX2dhc19ib2xpdmlhX2NvbXRyYWRlID0gcHJlY2lvX2V4cG9fZ2FzX2JvbGl2aWEgKSkgJT4lDQogIGxlZnRfam9pbihoZW5yeV9odWIpICU+JSANCiAgYXJyYW5nZShhbmlvKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvX2V4cG9feV9tZV9nYXMsIHBhdGggPSAicHJlY2lvX2V4cG9feV9tZG9fbXVuZGlhbF9nYXMueGxzeCIpDQojIHdyaXRleGw6OndyaXRlX3hsc3goY29tcGFyYWNpb25fYmVwLCBwYXRoID0gImNvbXBhcmFjaW9uX2JlcC54bHN4IikNCg0KDQpjb21wYXJhY2lvbl9wcmVjaW9zIDwtIHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19leHRlcm5vX2dhcykgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByZWNpb19nYXNfbWRvaW50KSkNCiANCmBgYA0KYnVzY2Ftb3MgdW4gcHJlY2lvDQoNCmN1YW50byBlcyB1bmEgY2FudGlkYWQgZGUgYnR1IGRlIGdhcyBhbCBwcmVjaW8gZGUgcmVmZXJlbmNpYSAoZWogYm9saXZpYSkgeSBjdWFudG8gZXMgc2kgY29udmllcnRvIGVzb3MgYnR1IGEgYmFycmlsZXMgeSBsb3MgdmFsb3Jpem8gY29uIGVsIHByZWNpbyBkZWwgYmFycmlsPyBjdWFudG8gcXVlZGEgbGEgdW5pZGFkIGVuIGJ0dSBzaSB0b21vIGVsIHByZWNpbyBkZSBwZXRyb2xlbyB5IGxvIGNvdmllcnRvIGEgYnR1LiANCmVzIGRlY2lyLCBjdWFudG8gZXMgZWwgdmFsb3Igc2kgbGEgdmFsb3Jpem8gZW4gcHJlY2lvIGRlbCBwZXRyb2xlbw0KDQrCv2N1YW50b3MgdXNkIGVzIHVuIGJ0dSBkZSBwZXRyb2xlbz8NCnNpIHRvbW8gdW4gYmFycmlsIGRlIHBldHJvbGVvIHkgbG8gY29udmllcnRvIGEgYnR1ICggbWUgdmEgYSBkYXIgY3VhbnRvcyBVU0QgZXMgdW4gYnR1KQ0KbHVlZ28gY29tcGFybyBsb3MgVVNEL2J0dSB5IGxvIGNvbXBhcm8gY29uIGVsIGdhcyBkZSBib2xpdmlhDQoNCmdyaW5iZXI6IGNvbnZpZXJ0ZSB0b2RvIGVsIGdhcyBlbiBwZXRyb2xlbyB5IGxlIHBvbmUgZWwgcHJlY2lvIGRlIHBldHJvZWxvZS4gc3ViZXN0aW1hIGxvcyBwcmVjaW9zIGRlbCBnYXM/DQoNCmBgYHtyfQ0KcHJlY2lvX2NydWRvX3ZzX2dhcyA8LSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfYmVwICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC11bmlkYWQpICU+JSANCiAgICAgICAgICAgICAgZ2F0aGVyKGtleSA9IHRpcG9fcHJlY2lvX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA9IHByZWNpb19jcnVkb191c2RfYmJsLA0KICAgICAgICAgICAgICAgICAgICAgMjpuY29sKC4pKSwgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUocHJlY2lvX2NydWRvX3NvYnJlX2dhcyA9cHJlY2lvX2NydWRvX3VzZF9iYmwvcHJlY2lvX2V4dGVybm9fZ2FzKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKHByZWNpb19jcnVkb19zb2JyZV9nYXMpKSwgDQogICAgICAgICAhKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygid3RpX3Nwb3RfcHJpY2VfZnJlZCIsICJwcmVjaW9fbWVfY3J1ZG8iKSkgICkNCiAgICAgICAgICMgKHRpcG9fcHJlY2lvX2NydWRvICVpbiUgYygiYnJlbnRfaWVhIikpICApDQogICAgICAgICAjICh0aXBvX3ByZWNpb19jcnVkbyAlaW4lIGMoImJyZW50X2llYSIsICJicmVudF9oaXN0b3JpYyIpKSAgKQ0KcHJlY2lvX2NydWRvX3ZzX2dhcw0KDQpncmFmIDwtICBwcmVjaW9fY3J1ZG9fdnNfZ2FzICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBwcmVjaW9fY3J1ZG9fc29icmVfZ2FzLCBjb2xvcj10aXBvX3ByZWNpb19jcnVkbykpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh0aXRsZSA9ICJwcmVjaW8gZGVsIGNydWRvIHNvYnJlIGVsIGRlbCBnYXMgKGFtYm9zIGVuIGJhcnJpbGVzKSIpDQoNCmdncGxvdGx5KGdyYWYsIHdpZHRoID0gODAwLCBsZW5ndGg9NjAwKQ0KIyBncmFmDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChwcmVjaW9fY3J1ZG9fdnNfZ2FzLCBwYXRoPSAicHJlY2lvIGRlbCBjcnVkbyB2cyBnYXMueGxzeCIpICANCmBgYA0KDQoNCg0KIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMNCg0KKiBGdWVudGVzDQogICsgW1NFU0NPIERvd25zdHJlYW1dKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvZW5lcmdpYS1yZWZpbmFjaW9uLWNvbWVyY2lhbGl6YWNpb24tcGV0cm9sZW8tZ2FzLWRlcml2YWRvcy10YWJsYXMtZGluYW1pY2FzKQ0KICArIElOREVDDQogICsgTUVDT04NCiAgKyBVTkNvbXRyYWRlDQoNCiMjIyMgRXhwb3J0YWNpb25lcyBlIEltcG9ydGFjaW9uZXMgZGUgQ3J1ZG8NCiogRXhwb3J0YWNpb25lcyBkZSBDcnVkbzogDQogICsgMTk2MiBhIDE5OTM6IFVOIENvbXRyYWRlDQogICsgMTk5NCBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIExvcyBkYXRvcyBmYWx0YW50ZXMgZGUgU0VTQ08gc2UgY29tcGxldGFyb24gY29uIE1FQ09ODQogICsgU2lndWVuIGhhYmllbmRvIGRhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTY1LCAxOTcwLTc0LCAxOTc2LTc4LCAxOTgwLTg0DQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIyMgU0VTQ08NCiNjYW50aWRhZGVzLiBwb3N0IDIwMTAgKGhhc3RhIDIwMTkpDQppbXBvcnRhY2lvbmVzX2V4cG9ydGFjaW9uZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvU0VTQ08vUmVmaW5hY2nDs24geSBjb21lcmNpYWxpemFjaW9uL2ltcG9ydGFjaW9uZXMtZXhwb3J0YWNpb25lcy5jc3YiKQ0KDQojIGNhbnRpZGFkZXMuIHBvc3QgMjAxNiANCmltcG9ydGFjaW9uZXNfZXhwb3J0YWNpb25lc19wb3N0MjAxNiA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9TRVNDTy9SZWZpbmFjacOzbiB5IGNvbWVyY2lhbGl6YWNpb24vaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzLWEtcGFydGlyLWRlbC0yMDE2LS5jc3YiKQ0KDQojIyMjY29tZXJjaW8gZXh0ZXJpb3IgcG9zdCAyMDEwOiAiVERfY29tZXJjaW9fZXh0ZXJpb3IueGxzeCINCmNvbWV4X3Bvc3QyMDEwIDwtIHJlYWRfZGVsaW0oIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL2NvbWV4X3Bvc3QyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSwgDQogICAgc2tpcCA9IDUpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9IGNhc2Vfd2hlbihEYXRvcyA9PSAiU3VtYSBkZSBtb250byIgfiAiVVNEIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdW5pZGFkKSwNCiAgICAgICAgIAl1bmlkYWQgPSBzdHJfcmVtb3ZlX2FsbCgJdW5pZGFkLCAiWygpXSIgKSwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSkgJT4lICANCiAgZmlsdGVyKCFpcy5uYShhbmlvKSkgJT4lIA0KICByZW5hbWUoZXhwb3J0YWNpb24gPSAiRXhwb3J0YWNpw7NuIiwNCiAgICAgICAgIGltcG9ydGFjaW9uID0gIkltcG9ydGFjacOzbiIpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBhbmlvLCBtZXMsIGV2ZXJ5dGhpbmcoLiksIC1jKCJUb3RhbCBnZW5lcmFsIiwgRGF0b3MpKSAlPiUgDQogIGdhdGhlciguLA0KICAgICAgICAga2V5ID0gdmFyaWFibGUsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgNjo3KQ0KDQojb3RyYSBiYXNlLiBzb2xvIGNhbnRpZGFkZXMuIHZlciBkZSBkb25kZSBhcGFyZWNpw7MNCmltcG9fZXhwbyA8LSByZWFkX2NzdigiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvaW1wb3J0YWNpb25lcy1leHBvcnRhY2lvbmVzICgxKS5jc3YiKQ0KDQoNCiMjI2V4cG9ydGFjaW9uZXMgcHJlIDIwMTA6ICJFeHBvcnRhY2lvbmVzLnhsc3giDQpleHBvX3ByZTIwMTAgPC0gcmVhZF9kZWxpbSgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvZXhwb19wcmUyMDEwLmNzdiIsIA0KICAgICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIG1lcyA9ICJNZXMiLA0KICAgICAgICAgcHJvZHVjdG8gPSBQcm9kdWN0bywNCiAgICAgICAgIHZhbG9yID0gVG90YWwpICU+JSANCiAgbXV0YXRlKGFuaW8gPSB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBtZXMgPSB6b286Om5hLmxvY2YobWVzKSwNCiAgICAgICAgIHByb2R1Y3RvID0gem9vOjpuYS5sb2NmKHByb2R1Y3RvKSwNCiAgICAgICAgIHZhcmlhYmxlID0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIGZlY2hhID0gYXMuRGF0ZShwYXJzZV9kYXRlX3RpbWUocGFzdGUwKGFuaW8sIG1lcyksIG9yZGVycyA9ICJ5bSIpKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KERhdG9zLCAiTTMiKSB+ICJtMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIlRvbiIpIH4gInRvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChEYXRvcywgIkZPQiIpIH4gIlVTRCIpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZXZlcnl0aGluZyguKSwgLWMoRGF0b3MpKQ0KDQojbm8gc2UgZGUgZG9uZGUgc2FsacOzIGVzdGUgcGVybyBoYWJyaWEgcSByYXN0cmVhcmxvDQpleHBvX3VzZF90b24gPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9leHBvX3VzZF90b24uY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFLCANCiAgICBza2lwID0gMykNCg0KIyMjaW1wb3J0YWNpb25lcyBwcmUgMjAxMDogIkltcG9ydGFjaW9uZXMueGxzeCINCmltcG9fcHJlMjAxMCA8LSByZWFkX2RlbGltKCIvQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9pbXBvX3ByZTIwMTAuY3N2IiwgDQogICAgIjsiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgbWVzID0gIk1lcyIsDQogICAgICAgICBwcm9kdWN0byA9IFByb2R1Y3RvLA0KICAgICAgICAgdmFsb3IgPSBUb3RhbCkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHpvbzo6bmEubG9jZihhbmlvKSwNCiAgICAgICAgIG1lcyA9IHpvbzo6bmEubG9jZihtZXMpLA0KICAgICAgICAgcHJvZHVjdG8gPSB6b286Om5hLmxvY2YocHJvZHVjdG8pLA0KICAgICAgICAgdmFyaWFibGUgPSAiaW1wb3J0YWNpb24iLA0KICAgICAgICAgZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpLA0KICAgICAgICAgdW5pZGFkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoRGF0b3MsICJNMyIpIH4gIm0zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiVG9uIikgfiAidG9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KERhdG9zLCAiRk9CIikgfiAiVVNEIikpICU+JSANCiAgc2VsZWN0KGZlY2hhLCBldmVyeXRoaW5nKC4pLCAtYyhEYXRvcykpDQojIGltcG9fcHJlMjAxMA0KDQoNCiNCYXNlIHVuaWRhIGRlIFNFU0NPDQpjb21lcmNpb19leHRlcmlvciA8LSBjb21leF9wb3N0MjAxMCAlPiUgDQogIGJpbmRfcm93cyhpbXBvX3ByZTIwMTAsIGV4cG9fcHJlMjAxMCkgJT4lIA0KICBhcnJhbmdlKGZlY2hhKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm1pbGVzL20zIiB+IHZhbG9yICogMTAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvciksDQogICAgICAgICB1bmlkYWQgPSBjYXNlX3doZW4odW5pZGFkID09ICJtaWxlcy9tMyIgfiAibTMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB1bmlkYWQpKQ0KDQojZXhwbyBlIGltcG8gZGUgQ3J1ZG8uIGNhbnRpZGFkZXMgeSB2YWxvcg0KY29tZXhfY3J1ZG9fc2VzY28gPC0gY29tZXJjaW9fZXh0ZXJpb3IgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChwcm9kdWN0bywgIlBFVFJPTEVPIikgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiQ3VlbmNhIiksDQogICAgICAgICB1bmlkYWQgIT0gIlRvbiIpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgdmFyaWFibGUsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgbXV0YXRlKHByb2R1Y3RvID0gImNydWRvIiwNCiAgICAgICAgIHZhbG9yID0gY2FzZV93aGVuKHVuaWRhZCA9PSAibTMiIH4gY29udmVyc29yX20zYmJsX3EodmFsb3IpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZCA9IGNhc2Vfd2hlbih1bmlkYWQgPT0gIm0zIiB+ICJiYXJyaWxlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHVuaWRhZCkpDQoNCg0KI3F1w6kgcHJvZHVjdG9zIGVudHJhbiBlbiBlbCBmaWx0cm8gZGUgY3J1ZG8/DQojIHVuaXF1ZSgoY29tZXJjaW9fZXh0ZXJpb3IgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiUEVUUk9MRU8iKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJDdWVuY2EiKSkpJHByb2R1Y3RvKQ0KDQoNCiNNRUNPTg0KY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIA0KICAgIHNoZWV0ID0gIkNvbS4gZXh0ZXJpb3IiLCBza2lwID0gNykgJT4lDQogIHJlbmFtZShhbmlvID0gJy4uLjEnICwNCiAgICAgICAgIGV4cG9fTW0zX2NydWRvID0gJ0V4cG9ydGFjaW9uZXMuLi4yJywNCiAgICAgICAgIGltcG9fTW0zX2NydWRvID0gJ0ltcG9ydGFjaW9uZXMuLi4zJywNCiAgICAgICAgIHNhbGRvX01tM19jcnVkbyA9IGBCYWxhbmNlIChYLU0pLi4uNGAsDQogICAgICAgICBleHBvX01NbTNfZ2FzID0gJ0V4cG9ydGFjaW9uZXMuLi41JywNCiAgICAgICAgIGltcG9fTW0zX2dhcyA9ICdJbXBvcnRhY2lvbmVzLi4uNicsDQogICAgICAgICBzYWxkb19NbTNfZ2FzID0gYEJhbGFuY2UgKFgtTSkuLi43YCwNCiAgICAgICAgIGV4cG9fbWV0YWxpZmVyb3Nfb3Ryb3NfTU11c2QgPSBgTWluZXJhbGVzIG1ldGFsw61mZXJvcywgZXNjb3JpYXMgeSBjZW5pemFzYCwNCiAgICAgICAgIGV4cG9fY3J1ZG9fTU11c2QgPSBgUGV0csOzbGVvIGNydWRvYCwNCiAgICAgICAgIGV4cG9fZ2FzX01NdXNkID0gYEdhcyBkZSBwZXRyw7NsZW8geSBvdHJvcyBoaWRyb2NhcmJ1cm9zYCwNCiAgICAgICAgIGV4cG9fY2FyYnVyYW50ZXNfb3Ryb3NfTU11c2QgPSBgQ2FyYnVyYW50ZXMsIGdyYXNhcyB5IGFjZWl0ZXMgbHVicmljYW50ZXNgLA0KICAgICAgICAgZXhwb19lbGVjdHJpY2FfTU11c2QgPSBgRW5lcmfDrWEgZWzDqWN0cmljYWAsDQogICAgICAgICBleHBvX3Jlc3RvX2NvbWJ1c3RpYmxlc19NTXVzZCA9IGBSZXN0byBkZSBjb21idXN0aWJsZXNgKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbyApKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKSAlPiUgDQogIG11dGF0ZShleHBvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKGV4cG9fTW0zX2NydWRvKjEwMDApLA0KICAgICAgICAgaW1wb19iYmxfY3J1ZG8gPSBjb252ZXJzb3JfbTNiYmxfcShpbXBvX01tM19jcnVkbyoxMDAwKSwNCiAgICAgICAgIHNhbGRvX2JibF9jcnVkbyA9IGNvbnZlcnNvcl9tM2JibF9xKHNhbGRvX01tM19jcnVkbyoxMDAwKSkNCg0KDQojSU5ERUMgLSBDb21FeA0KI2NhbnRpZGFkZXMNCmNhbnRpZGFkZXNfZXhwb19oaWRyb19pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvY2FudGlkYWRlc19leHBvX2hpZHJvX2luZGVjLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lIA0KICByZW5hbWUoZXhwb19pbmRlY19jcnVkbyA9IHBldHJvbGVvX2NydWRvX2V4cG8sDQogICAgICAgICAgIGV4cG9faW5kZWNfZ2FzICA9IGdhc19uYXR1cmFsX2V4cG8pDQoNCiN2YWxvcg0KZXhwb19oaWRyb192YWxvcl9pbmRlYyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSU5ERUMvQ29tRXgvZXhwb19oaWRyb192YWxvci5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgcmVuYW1lKGV4cG9faW5kZWNfY3J1ZG8gPSBwZXRyb2xlb19jcnVkb19leHBvLA0KICAgICAgICAgICBleHBvX2luZGVjX2dhcyAgPSBnYXNfbmF0dXJhbF9leHBvKQ0KDQoNCg0KI01lcmdlIGRlIGJhc2VzDQojQ3J1ZG8gZXhwbyBjYW50aWRhZA0KZXhwb19xX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAiYmFycmlsZXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgdmFsb3IpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgcmVuYW1lKGV4cG9fc2VzY29fY3J1ZG8gPSB2YWxvcikgJT4lIA0KICBsZWZ0X2pvaW4oY29tZXhfaGlkcm9jYXJidXJvc19tZWNvbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX21lY29uX2NydWRvID0gZXhwb19iYmxfY3J1ZG8pKSAlPiUgDQogIGxlZnRfam9pbihjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWV4cG9faW5kZWNfZ2FzKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9jYW50aWRhZCwgZXhwb19jb210cmFkZV9jcnVkbyA9IGV4cG9fYmJsICkpICU+JSANCiAgbXV0YXRlKGV4cG9fY3J1ZG8gPSBjYXNlX3doZW4oYW5pbyA8IDE5OTkgIH4gZXhwb19jb210cmFkZV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmlvICVpbiUgMTk5OToyMDE0IH4gZXhwb19tZWNvbl9jcnVkbyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5OSB+IGV4cG9fc2VzY29fY3J1ZG8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMubmEoZXhwb19zZXNjb19jcnVkbykgfiBleHBvX21lY29uX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZXhwb19zZXNjb19jcnVkbyksDQogICAgICAgICB1bmlkYWQgPSAiYmFycmlsZXMiKSAlPiUgIywNCiAgICAgICAgICMgZGlmID0gZXhwb19jcnVkby9leHBvX2luZGVjX2NydWRvIC0gMSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLGV4cG9fY3J1ZG8sIGV2ZXJ5dGhpbmcoLiksIC12YXJpYWJsZSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQoNCg0KIyBNZXJnZSBjcnVkbyBVU0QNCmV4cG9fdXNkX2NydWRvIDwtIGNvbWV4X2NydWRvX3Nlc2NvICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIgLCB1bmlkYWQgPT0gIlVTRCIpICU+JSANCiAgcmVuYW1lKGV4cG9fY3J1ZG9fc2VzY28gPSB2YWxvcikgJT4lDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fY3J1ZG9fbWVjb24gPSBleHBvX2NydWRvX01NdXNkKSkgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19oaWRyb192YWxvcl9pbmRlYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2luZGVjX2NydWRvKSkgJT4lIA0KICBmdWxsX2pvaW4oZXhwb19jcnVkb19zaXRjICU+JSANCiAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfdmFsb3IsIGV4cG9fY29tdHJhZGVfY3J1ZG8gPSBleHBvX3VzZF9jb210cmFkZV9jcnVkbykpICU+JQ0KICBtdXRhdGUoZXhwb19jcnVkb19tZWNvbiA9IGV4cG9fY3J1ZG9fbWVjb24gKjEwMDAwMDAsDQogICAgICAgICBleHBvX2NydWRvID0gY2FzZV93aGVuKGFuaW8gPDE5OTQgfiBleHBvX2NvbXRyYWRlX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTQgfiBleHBvX2NydWRvX3Nlc2NvKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2NydWRvLCBldmVyeXRoaW5nKC4pLCAtYyh2YXJpYWJsZSwgcHJvZHVjdG8pKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgbXV0YXRlX2FsbChmdW5jdGlvbih4KSB7eC8xMF42fSkNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QodXNkID0gZXhwb191c2RfY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgY2FudGlkYWRlcyA9IGV4cG9fcV9jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZWNpb19leHBvcnRhY2lvbl95X3JlZmVyZW5jaWEgPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvKSwgDQogICAgICAgICAgICAgICAgICAgICMgcGF0aCA9ICJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3Jlc3VsdGFkb3MvZXhwb19jcnVkby54bHN4IikNCg0KZXhwb19xX2NydWRvDQpleHBvX3VzZF9jcnVkbw0KYGBgDQoNCg0KIyMjIyBFeHBvcnRhY2lvbmVzIGUgSW1wb3J0YWNpb25lcyBkZSBHYXMNCiogRnVlbnRlcyBzZWxlY2Npb25hZGFzOg0KICsgMTk2MiBhIDE5OTY6IFVOIENvbXRyYWRlLA0KICsgMTk5NyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICsgRGF0b3MgZmFsdGFudGVzIHBhcmEgbG9zIGHDsW9zIDE5OTkgeSAyMDAwDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojU0VTQ08NCmNvbWV4X2dhcyA8LSBjb21lcmNpb19leHRlcmlvciAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR0FTIE5BVFVSQUwiKSB8IHN0cl9kZXRlY3QocHJvZHVjdG8sICJHYXMgTmF0dXJhbCIpIA0KICAgICAgICAgfCBzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiR2FzIGRlIFJlZmluZXLDrWEiKSwNCiAgICAgICAgIHByb2R1Y3RvICE9ICJHYXMgTmF0dXJhbCBMaWN1YWRvIiwNCiAgICAgICAgIHVuaWRhZCAhPSAiVG9uIikgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHZhcmlhYmxlLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSU+JSANCiAgbXV0YXRlKHByb2R1Y3RvID0gImdhcyIpDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2NydWRvX3Nlc2NvICU+JSBmaWx0ZXIodW5pZGFkID09ICJVU0QiLCB2YXJpYWJsZSA9PSAiaW1wb3J0YWNpb24iKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWV4X2dhcyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAiVVNEIiwgdmFyaWFibGUgPT0gImltcG9ydGFjaW9uIiksDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIlVTRCIsIHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIpKSwgDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJjb21leF9zZXNjby54bHN4IikNCg0KI0V4cG8gZ2FzIFNFU0NPIGNhbnRpZGFkZXMNCmV4cG9fc2VzY29fcV9nYXMgPC0gY29tZXhfZ2FzICAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlID09ICJleHBvcnRhY2lvbiIsDQogICAgICAgICB1bmlkYWQgPT0gIm0zIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lDQogIHJlbmFtZShleHBvX3Nlc2NvX2dhcyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGV4cG9fc2VzY29fZ2FzID0gcmVwbGFjZV9uYShleHBvX3Nlc2NvX2dhcywgMCApLA0KICAgICAgICAgZXhwb19zZXNjb19nYXMgPSBleHBvX3Nlc2NvX2dhcyAvIDEwMDAsDQogICAgICAgICB1bmlkYWQgPSAiTWlsZXMgZGUgbTMiKQ0KDQojZXhwbyBzZXNjbyBnYXMgdmFsb3INCmV4cG9fc2VzY29fdXNkX2dhcyA8LSBjb21leF9nYXMgICU+JQ0KICBmaWx0ZXIodmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIiwNCiAgICAgICAgIHVuaWRhZCA9PSAiVVNEIikgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWModmFyaWFibGUsIHByb2R1Y3RvKSkgJT4lDQogIHJlbmFtZShleHBvX3Nlc2NvX2dhcyA9IHZhbG9yKSAlPiUNCiAgbXV0YXRlKGV4cG9fc2VzY29fZ2FzID0gcmVwbGFjZV9uYShleHBvX3Nlc2NvX2dhcywgMCApKQ0KDQoNCiNleHBvIFVOIENvbXRyYWRlDQpleHBvX2dhc19zaXRjIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9VTiBDb210cmFkZS9yZXN1bHRhZG9zL2V4cG9fZ2FzX3NpdGMuY3N2IikgICU+JSANCiAgcmVuYW1lKHRyYWRlX3ZhbHVlX3VzZCA9ICJUcmFkZSBWYWx1ZSAoVVMkKSIpICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJVU0QiLA0KICAgICAgICAgZXhwb19NbTMgPSBleHBvX01tMyAvMTAwMCwNCiAgICAgICAgIHVuaWRhZF9jYW50aWRhZCA9ICAiTWlsZXMgZGUgbTMiKQ0KDQoNCiNNZXJnZSBjYW50aWRhZGVzDQpleHBvX3FfZ2FzIDwtICBleHBvX3Nlc2NvX3FfZ2FzICU+JSANCiAgbGVmdF9qb2luKGNvbWV4X2hpZHJvY2FyYnVyb3NfbWVjb24gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfbWVjb24gPSBleHBvX01NbTNfZ2FzKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHVuaWRhZCA9ICJNaWxlcyBkZSBtMyIsDQogICAgICAgICAgICAgICAgICAgICBleHBvX2dhc19tZWNvbiA9IGV4cG9fZ2FzX21lY29uICogMTAwMCkgKSAlPiUgDQogIGxlZnRfam9pbihjYW50aWRhZGVzX2V4cG9faGlkcm9faW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoLWV4cG9faW5kZWNfY3J1ZG8pKSAlPiUgDQogIGZ1bGxfam9pbihleHBvX2dhc19zaXRjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfY29tdHJhZGUgPSBleHBvX01tMywgdW5pZGFkID0gdW5pZGFkX2NhbnRpZGFkICkpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gZXhwb19zZXNjb19nYXMvIGV4cG9faW5kZWNfZ2FzIC0gMSApICU+JQ0KICBtdXRhdGUoZXhwb19nYXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTcgfiBleHBvX2dhc19jb210cmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+IDE5OTYgfmV4cG9fc2VzY29fZ2FzICkpICU+JSANCiAgYXJyYW5nZShhbmlvKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4cG9fZ2FzLCBldmVyeXRoaW5nKC4pKQ0KDQpleHBvX3FfZ2FzX01NQlRVIDwtIGV4cG9fcV9nYXMgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQpKSAlPiUgDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge2NvbnZlcnNvcl9tM01NQlRVX3EoeCoxMDAwKX0gKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAiTU1CVFUiKQ0KDQojTWVyZ2UgdmFsb3INCmV4cG9fdXNkX2dhcyA8LSBleHBvX3Nlc2NvX3VzZF9nYXMgJT4lDQogIGxlZnRfam9pbihjb21leF9oaWRyb2NhcmJ1cm9zX21lY29uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfTU11c2QpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGV4cG9fZ2FzX21lY29uID0gZXhwb19nYXNfbWVjb24gKiAxMDAwMDAwKSkgICU+JSANCiAgbGVmdF9qb2luKGV4cG9faGlkcm9fdmFsb3JfaW5kZWMgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgZXhwb19nYXNfaW5kZWMgPSBleHBvX2luZGVjX2dhcykpICU+JSANCiAgZnVsbF9qb2luKGV4cG9fZ2FzX3NpdGMgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2dhc19jb210cmFkZSA9IHRyYWRlX3ZhbHVlX3VzZCwgdW5pZGFkICkpICU+JSANCiAgIyBtdXRhdGUoZGlmID0gZXhwb19zZXNjb19nYXMvZXhwb19nYXNfaW5kZWMgLTEpICU+JSANCiAgbXV0YXRlKGV4cG9fZ2FzID0gY2FzZV93aGVuKGFuaW8gPCAxOTk3IH4gZXhwb19nYXNfY29tdHJhZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk5NyB+IGV4cG9fc2VzY29fZ2FzKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2dhcywgZXZlcnl0aGluZyguKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQogIA0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCggY2FudGlkYWRlcyA9IGV4cG9fcV9nYXMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRCA9IGV4cG9fdXNkX2dhcywgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4cG9feV9yZWZlcmVuY2lhID0gcHJlY2lvX2V4cG9feV9tZV9nYXMpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9leHBvX2dhcy54bHN4IikNCg0KIyBjb21leF9jcnVkb19zZXNjbyAlPiUgZmlsdGVyKHVuaWRhZCA9PSAibTMiLCB2YXJpYWJsZSA9PSAiZXhwb3J0YWNpb24iKQ0KIyBjb21leF9nYXMgJT4lIGZpbHRlcih1bmlkYWQgPT0gIm0zIiwgdmFyaWFibGUgPT0gImV4cG9ydGFjaW9uIikNCmV4cG9fcV9nYXMgDQpleHBvX3VzZF9nYXMNCmBgYA0KDQojIyBFbXBsZW8sIFJlbXVuZXJhY2lvbmVzIHkgTWFzYSBTYWxhcmlhbCAoQ0NOTikNCg0KKiBTYWxhcmlvIHkgZW1wbGVvDQogICsgTVRFeVNTIChCYXNlIE1pbmVyw61hIGUgSGlkcm9jYXJidXJvcyBkZSBsYXMgQ3VlbnRhcyBOYWNpb25hbGVzKSAoMTk5Ni0yMDEzKQ0KICArIFtNaW5pc3RlcmlvIGRlIFRyYWJham8sIEVtcGxlbyB5IFNlZ3VyaWRhZCBTb2NpYWwgLSBPYnNlcnZhdG9yaW8gZGUgRW1wbGVvIHkgRGluw6FtaWNhIEVtcHJlc2FyaWFsIChPRURFKV0oaHR0cDovL3d3dy50cmFiYWpvLmdvYi5hci9lc3RhZGlzdGljYXMvb2VkZS9lc3RhZGlzdGljYXNuYWNpb25hbGVzLmFzcCkgKDE5OTYtMjAxOSkNCiAgKyBFUEggPz8NCjxicj4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNhbnVhcmlvcyBDRVBBTA0KY2VwYWxfMTk5MSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0NFUEFML2NlcGFsXzE5OTEueGxzeCIpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyBjb252ZXJzb3JfcGVzb3MkQSAvMTBeMywNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikNCg0KbWFzYV9zYWxhcmlhbF9jZXBhbCA8LSBjZXBhbF8xOTkxICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJyZW11bmVyYWNpb25fYWxfdHJhYmFqbyIpICU+JSANCiAgcmVuYW1lKG1zX2NlcGFsID0gdmFsb3IpDQogIA0KDQojY29uIGRhdG9zIGRlIGxhIGJhc2UgZGUgQ0NOTg0KZW1wbGVvIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvTWVjb24vYmFzZS1taW5lcmlhLWUtaGlkcm9jYXJidXJvcyBjdWVudGFzIG5hY2lvbmFsZXMueGxzIiwgDQogICAgc2hlZXQgPSAiRW1wbGVvIHJlZ2lzdHJhZG8iLCBza2lwID0gNSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgICBwZXJpb2RvID0iUGVyw61vZG8iLA0KICAgICAgICAgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9ICIuLi43IiwNCiAgICAgICAgZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gIi4uLjgiICkgJT4lDQogICBmaWx0ZXIoaXMubmEocGVyaW9kbyksICFpcy5uYShhbmlvKSApICU+JQ0KICBzZWxlY3QoYW5pbywgZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyxlbXBsZW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfZW1wbGVvID0gIlB1ZXN0b3MgZGUgdHJhYmFqbyIsDQogICAgICAgICBlbXBsZW9fZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKGVtcGxlb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgZW1wbGVvX3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zID0gYXMuZG91YmxlKGVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykpIA0KICANCg0Kc2FsYXJpb3MgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NZWNvbi9iYXNlLW1pbmVyaWEtZS1oaWRyb2NhcmJ1cm9zIGN1ZW50YXMgbmFjaW9uYWxlcy54bHMiLCANCiAgICBzaGVldCA9ICJSZW11bmVyYWNpb25lcyIsIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCANCiAgICAgICAgImRhdGUiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiksIHNraXAgPSA1KSAlPiUgDQogICAgcmVuYW1lKGFuaW8gPSAiQcOxbyIsDQogICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgICBzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9ICIuLi43IiwNCiAgICAgICAgIHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSAgIi4uLjgiKSAlPiUgDQogIGZpbHRlcighaXMubmEoYW5pbykgJiBhbmlvIDwgMjAxNCkgJT4lIA0KICBzZWxlY3QoYW5pbywgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3Msc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyApICU+JSANCiAgbXV0YXRlKHVuaWRhZF9zYWxhcmlvID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgc2FsYXJpb19leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZShzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyksDQogICAgICAgIHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgPSBhcy5kb3VibGUoc2FsYXJpb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcykpDQogICANCm1hc2Ffc2FsYXJpYWxfY2NubiA8LSBlbXBsZW8gJT4lIA0KICBsZWZ0X2pvaW4oc2FsYXJpb3MsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZSh1bmlkYWRfbWFzYV9zYWxhcmlhbCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiA9IChzYWxhcmlvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAqZW1wbGVvX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfc2VydmljaW9zID0gKHNhbGFyaW9fc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKmVtcGxlb19zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyoxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWwgPSBtYXNhX3NhbGFyaWFsX2V4dHJhY2Npb24gKyBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcykgDQoNCg0KDQojY29uIGRhdG9zIGRlIGVtcGxlbyByZWdpc3RyYWRvIA0KcmVtdW5lcmFjaW9uZXNfYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NaW5pc3RlcmlvIFRyYWJham8vbmFjaW9uYWxfc2VyaWVfcmVtdW5lcmFjaW9uZXNfYW51YWwueGxzeCIsIA0KICAgIHNoZWV0ID0gIkMgNSIsIGNvbF90eXBlcyA9IGMoInNraXAiLCANCiAgICAgICAgInRleHQiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiksIHNraXAgPSA0KSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIHJlbmFtZShyYW1hX2FjdGl2aWRhZCA9ICJSYW1hIGRlIGFjdGl2aWRhZCIpICU+JSANCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KHJhbWFfYWN0aXZpZGFkLCAicGV0csOzbGVvIikpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9zYWxhcmlvID0gIlBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgcmFtYV9hY3RpdmlkYWQ9IA0KICAgICAgICAgICBjYXNlX3doZW4ocmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmlkYWRlcyAgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbXVuZXJhY2lvbl9zZXJ2aWNpb3NfZXh0cmFjY2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwiIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbXVuZXJhY2lvbl9leHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogICAgZmlsdGVyKCEoaXMubmEocmFtYV9hY3RpdmlkYWQpKSkgJT4lIA0KICBzcHJlYWQoa2V5ID0gcmFtYV9hY3RpdmlkYWQsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yKQ0KICANCg0KDQplbXBsZW9fYW51YWwgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9NaW5pc3RlcmlvIFRyYWJham8vbmFjaW9uYWxfc2VyaWVfZW1wbGVvX2FudWFsLnhsc3giLCANCiAgICBzaGVldCA9ICJDIDUiLCBjb2xfdHlwZXMgPSBjKCJza2lwIiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsIA0KICAgICAgICAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJ0ZXh0IiwgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCANCiAgICAgICAgInRleHQiLCAidGV4dCIsICJ0ZXh0IiwgInRleHQiLCAidGV4dCIpLCANCiAgICBza2lwID0gNCklPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIHJlbmFtZShyYW1hX2FjdGl2aWRhZCA9ICJSYW1hIGRlIGFjdGl2aWRhZCIpICU+JSANCiAgZmlsdGVyKCBzdHJfZGV0ZWN0KHJhbWFfYWN0aXZpZGFkLCAicGV0csOzbGVvIikpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gYXMuZG91YmxlKHZhbG9yKSwNCiAgICAgICAgIHVuaWRhZF9lbXBsZW8gPSAiUHVlc3RvcyBkZSB0cmFiYWpvIiwNCiAgICAgICAgIHJhbWFfYWN0aXZpZGFkPSBjYXNlX3doZW4ocmFtYV9hY3RpdmlkYWQ9PQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3RpdmlkYWRlcyAgZGUgc2VydmljaW9zIHJlbGFjaW9uYWRhcyBjb24gbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBleGNlcHRvIGxhcyBhY3RpdmlkYWRlcyBkZSBwcm9zcGVjY2nDs24iIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcGxlb19zZXJ2aWNpb3NfZXh0cmFjY2lvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbWFfYWN0aXZpZGFkPT0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwiIH4gImVtcGxlb19leHRyYWNjaW9uX3BldHJvbGVvX2dhcyIpKSAlPiUgDQogIGZpbHRlcighKGlzLm5hKHJhbWFfYWN0aXZpZGFkKSkpICU+JSANCiAgc3ByZWFkKGtleSA9IHJhbWFfYWN0aXZpZGFkLA0KICAgICAgICAgdmFsdWUgPSB2YWxvcikNCg0KbWFzYV9zYWxhcmlhbF9vZWRlIDwtIGVtcGxlb19hbnVhbCAlPiUgDQogIGxlZnRfam9pbihyZW11bmVyYWNpb25lc19hbnVhbCwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHVuaWRhZF9tYXNhX3NhbGFyaWFsID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiLA0KICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uID0gKCAgcmVtdW5lcmFjaW9uX2V4dHJhY2Npb25fcGV0cm9sZW9fZ2FzICplbXBsZW9fZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMqMTMpLzEwXjYsDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyA9IChyZW11bmVyYWNpb25fc2VydmljaW9zX2V4dHJhY2Npb24gKmVtcGxlb19zZXJ2aWNpb3NfZXh0cmFjY2lvbioxMykvMTBeNiwNCiAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWwgPSBtYXNhX3NhbGFyaWFsX3NlcnZpY2lvcyArIG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwNCiAgICAgICAgIGFuaW8gPWFzLmRvdWJsZShhbmlvKSkNCg0KbWFzYV9zYWxhcmlhbF9oaWRyb2NhcmJ1cm9zIDwtIG1hc2Ffc2FsYXJpYWxfY2NubiAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQgPSB1bmlkYWRfbWFzYV9zYWxhcmlhbCwgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX2Njbm49IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwgDQogICAgICAgICBtYXNhX3NhbGFyaWFsX3RvdGFsX2Njbm4gPSBtYXNhX3NhbGFyaWFsX3RvdGFsKSAlPiUgDQogIGZ1bGxfam9pbihtYXNhX3NhbGFyaWFsX29lZGUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX21hc2Ffc2FsYXJpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgbWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX29lZGU9IG1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbiwNCiAgICAgICAgICAgICAgICAgICAgIG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSA9bWFzYV9zYWxhcmlhbF90b3RhbCkpICU+JSANCiAgZnVsbF9qb2luKG1hc2Ffc2FsYXJpYWxfY2VwYWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBtc19jZXBhbCkpICU+JSANCiAgIyBtdXRhdGUobXMgPSBjYXNlX3doZW4oYW5pbyA8IDE5OTYgfiBtc19jZXBhbCwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA+PSAxOTk2IH5tYXNhX3NhbGFyaWFsX29lZGUpKSAlPiUgDQogIGFycmFuZ2UoYW5pbykNCm1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyAgDQoNCg0KYGBgDQoNCg0KDQojIyBQb3pvcw0KDQoNCiMjIyBNZXRyb3MgcGVyZm9yYWRvcw0KDQpGdWVudGU6DQoNCiogW1NlY3JldGFyw61hIGRlIEVuZXJnw61hXShodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L2VuZXJnaWEtcGVyZm9yYWNpb24tcG96b3MtcGV0cm9sZW8tZ2FzKQ0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQptZXRyb3NfcGVyZm9yYWRvc19wb3N0ZXJpb3JfYWxfMjAwOSA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9zZWNyZXRhcmlhIGRlIGVuZXJnaWEvbWV0cm9zLXBlcmZvcmFkb3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhpbmRpY2VfdGllbXBvID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLSVtIikpKQ0KDQptZXRyb3NfcGVyZm9yYWRvc19hbnRlcmlvcl9hbF8yMDA5IDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9tZXRyb3MtcGVyZm9yYWRvcy1hbnRlcmlvci1hbC0yMDA5LmNzdiIpICU+JSANCiAgcmVuYW1lKGNhbnRpZGFkID0gQ2FudGlkYWQpDQoNCm1ldHJvc19wZXJmb3JhZG9zX2VtcHJlc2EgPC0gbWV0cm9zX3BlcmZvcmFkb3NfcG9zdGVyaW9yX2FsXzIwMDkgJT4lDQogIGJpbmRfcm93cyhtZXRyb3NfcGVyZm9yYWRvc19hbnRlcmlvcl9hbF8yMDA5KSAlPiUgDQogIHNlbGVjdChhbmlvLCBtZXMsIGlkZW1wcmVzYSwgZW1wcmVzYSwgaWRjb25jZXB0bywgY29uY2VwdG8sIGNhbnRpZGFkLCBvYnNlcnZhY2lvbmVzICkgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EsIGVtcHJlc2EpICU+JQ0KICBzdW1tYXJpc2UobWV0cm9zX3BlcmZvcmFkb3MgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpDQogIA0KDQptZXRyb3NfcGVyZm9yYWRvcyA8LSBtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JQ0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShtZXRyb3NfcGVyZm9yYWRvcyA9IHN1bShtZXRyb3NfcGVyZm9yYWRvcywgbmEucm0gPSBUKSkgJT4lDQogIG11dGF0ZShpbmRpY2VfbWV0cm9zID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IG1ldHJvc19wZXJmb3JhZG9zLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDAxKSkgDQoNCmdyYWZfbWV0cm9zX3BlcmZvcmFkb3MgPC0gbWV0cm9zX3BlcmZvcmFkb3NfZW1wcmVzYSU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCBtZXRyb3NfcGVyZm9yYWRvcywgZmlsbCA9IGVtcHJlc2EpKSArDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIk1ldHJvcyBwZXJmb3JhZG9zIHBvciBlbXByZXNhIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ2dwbG90bHkoZ3JhZl9tZXRyb3NfcGVyZm9yYWRvcywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KDQojbGlzdGFkbyBkZSBlbXByZXNhcyBjb24gc3VzIGlkJ3MNCmxpc3RhZG9fZW1wcmVzYSA8LSBkaXN0aW5jdChtZXRyb3NfcGVyZm9yYWRvc19lbXByZXNhICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGlkZW1wcmVzYSwgZW1wcmVzYSksaWRlbXByZXNhLCAua2VlcF9hbGwgPSBUKSANCiAgDQoNCg0KYGBgDQoNCg0KDQojIyMgUG96b3MgZW4gb3BlcmFjacOzbg0KDQpGdWVudGVzOg0KDQoqIFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gW0RhdG9zIE1JTkVNXShodHRwczovL2dpdGh1Yi5jb20vZGF0b3NtaW5lbS9wcm9kdWNjaW9uLWRlLXBldHJvbGVvLXktZ2FzLXBvci1wb3pvKToNCiAgKyBbTGlzdGFkbyBkZSBwb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMgb3BlcmFkb3Jhc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8vYXJjaGl2by9jYmZhNGQ3OS1mZmIzLTQwOTYtYmFiNS1lYjBkZGU5YTgzODUpOiBzZSB0b21hIGxhIHZhcmlhYmxlICJGZWNoYSBkZWwgRmluIGRlIHRlcm1pbmFjacOzbiBkZSBwZXJmb3JhY2nDs24gZGVsIHBvem8iIChhZGppdl9mZWNoYV9maW5fdGVybSkgY29tbyBhw7FvIGRlIHB1ZXN0YSBlbiBwcm9kdWNjacOzbiBkZWwgcG96by4gU2UgcG9kcsOtYSBlbGFib3JhciB1biBzdG9jayBkZSBwb3pvcyBhIHBhcnRpciBkZSBhY3VtdWxhciBsb3MgcG96b3MgdGVybWluYWRvcyB5IHJlc3RhbmRvIGxvcyBwb3pvcyBhYmFuZG9uYWRvcywgYWdydXBhbmRvIGNvbiBsYSB2YXJpYWJsZSAiRmVjaGEgZGUgYWJhbmRvbm8gZGVsIHBvem8iKGFkaml2X2ZlY2hhX2FiYW5kb25vKQ0KICArIFtQb3pvcyB0ZXJtaW5hZG9zXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvcGVyZm9yYWNpb24tZGUtcG96b3MtZGUtcGV0cm9sZW8teS1nYXMvYXJjaGl2by9hMmNlMTRhZi01YzU2LTQ1YzItOWI5Yy1jN2ExZTUxNTZkZmYpDQogICsgW0NhcMOtdHVsbyBJVl0oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L3Byb2R1Y2Npb24tZGUtcGV0cm9sZW8teS1nYXMtcG9yLXBvem8vYXJjaGl2by9jYjVjMGYwNC03ODM1LTQ1Y2QtYjk4Mi0zZTI1Y2E3ZDc3NTEpDQogICsgW0VzdGFkbyBkZSBwb3pvc10oaHR0cDovL2RhdG9zLm1pbmVtLmdvYi5hci9kYXRhc2V0L2VzdGFkby1kZS1wb3pvcy1kZS1wZXRyb2xlby15LWdhcykgKEFVTiBOTyBTRSBQUk9DRVPDkyBFU1RBIEJBU0UgTkkgTEEgQU5URVJJT1IpIA0KICArIFtTRVNDT10oaHR0cDovL3d3dy5lbmVyZ2lhLmdvYi5hci9jb250ZW5pZG9zL3ZlcnBhZ2luYS5waHA/aWRwYWdpbmE9MTYyNCkNCiogW0lBUEddKGh0dHBzOi8vd3d3LmlhcGcub3JnLmFyL3dlYl9pYXBnL3NlY3RvcmVzL2VzdGFkaXN0aWNhcy9wcm9kdWN0b3MvbGlzdGFkb3MvbGlzdGFkb190b2Rvc19sb3NfcHJvZHVjdG9zLmh0bSkuIFNlIHByZXNlbnRhbiBkb3Mgc2VyaWVzOiB1bmEgZWxhYm9yYWRhIGEgcGFydGlyIGRlIGxvcyBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIChyZXN1bHRhbnRlIGRlIGRlc2NhcmdhciB1bmEgYmFzZSBwb3IgY2FkYSBhw7FvIGRlbCBzaXRpbyB3ZWIgb2ZpY2lhbCkgeSBvdHJhIHF1ZSBjb3JyZXNwb25kZSBhbCBzdG9jayBkZSBwb3pvcyBkZSBwZXRyw7NsZW8gZGUgZXh0cmFjY2nDs24gZWZlY3RpdmEgKHByb2NlZGVudGUgZGUgbG9zIGRhdG9zIGRlIEVzdGFkw61zdGljYXMgZGVsIENlbnRlbmFyaW8gZGUgSUFQRykuDQoNCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFLCBtZWNobz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQojIHNlYyBlbmVyZ2lhDQojIHBvem9zIGNhcmdhZG9zIHBvciBlbXByZXNhcw0KbGlzdGFkb19wb3pvcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9jYXBpdHVsbyBpdi9saXN0YWRvLWRlLXBvem9zLWNhcmdhZG9zLXBvci1lbXByZXNhcy1vcGVyYWRvcmFzLmNzdiIpICU+JSANCiAgbXV0YXRlKGFuaW9fdGVybWluYWNpb25fcG96byA9eWVhcihhZGppdl9mZWNoYV9maW5fdGVybSkpICU+JQ0KICBsZWZ0X2pvaW4obGlzdGFkb19lbXByZXNhKSAlPiUgDQogIGdyb3VwX2J5KGFuaW9fdGVybWluYWNpb25fcG96bywgaWRlbXByZXNhLCBlbXByZXNhKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyA9IG4oKSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGFuaW9fdGVybWluYWNpb25fcG96bykpDQoNCg0KICAjIG11dGF0ZShlbXByZXNhID0gY2FzZV93aGVuKGlkZW1wcmVzYSA9PSAiWVBGIiB+ICJZUEYiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQQUUiIH4gIlBBRSIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIllTVVIiIH4gIllTVVIiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQTFUiIH4gIlBsdXNwZXRyb2wiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJQTFVFIiB+ICJQbHVzcGV0cm9sIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiVklTIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlRQVCIgfiAiVGVjcGV0cm9sIiwgDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIkNHQyIgfiAiQ0dDIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiV0lOIiB+ICJXaW50ZXJzaGFsbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlRBVSIgfiAiVG90YWwgQXVzdHJhbCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIllTVVIiIH4gIllTVVIiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbXByZXNhID09ICJTSEUiIH4gIlNoZWxsIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW1wcmVzYSA9PSAiQ0FQIiB+ICJDYXBleCIsDQogICMgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVtcHJlc2EgPT0gIlBQQU0iIH4gIlBhbXBhIiwNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiAiT3RyYSIpKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0EiIH4gIlZpc3RhIE9pbCBhbmQgR2FzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiU0lOT1BFQyBBUkdFTlRJTkEgRVhQTE9SQVRJT04gQU5EIFBST0RVQ1RJT04sIElOQy4iIH4gIlNpbm9wZWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaWRlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlkZW1wcmVzYSA9PSAiWVNVUiBQRVRST0xFUkEgQVJHRU5USU5BIFMuQS4iIH4gIllTVVIiKSkNCg0KZ3JhZl9wb3pvc19zZWNfZW5lcmdpYSA8LSBsaXN0YWRvX3Bvem9zICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIHBvem9zLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJQb3pvcyBjYXJnYWRvcyBwb3IgZW1wcmVzYXMgb3BlcmFkb3JhcyAocG9yIGHDsW8gZGUgdGVybWluYWNpw7NuKSIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX3NlY19lbmVyZ2lhLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAgDQpwb3pvc190ZXJtaW5hZG9zX2FudGVyaW9yX2FsXzIwMDkgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3Mvc2VjcmV0YXJpYSBkZSBlbmVyZ2lhL3Bvem9zLXRlcm1pbmFkb3MtYW50ZXJpb3ItYWwtMjAwOS5jc3YiKSAlPiUgDQogIHJlbmFtZShjYW50aWRhZCA9IENhbnRpZGFkKQ0KDQpwb3pvc190ZXJtaW5hZG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL3NlY3JldGFyaWEgZGUgZW5lcmdpYS9wb3pvcy10ZXJtaW5hZG9zLmNzdiIpICU+JSANCiAgYmluZF9yb3dzKHBvem9zX3Rlcm1pbmFkb3NfYW50ZXJpb3JfYWxfMjAwOSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EsIGVtcHJlc2EgKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvcyAgPSBzdW0oY2FudGlkYWQsIG5hLnJtID0gVCkpDQoNCg0KZ3JhZl9wb3pvc190ZXJtaW5hZG9zIDwtIHBvem9zX3Rlcm1pbmFkb3MgJT4lDQogIGdncGxvdChhZXMoYW5pbywgcG96b3MgLCBmaWxsID0gZW1wcmVzYSkpKw0KICBnZW9tX2NvbCgpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSsNCiAgbGFicyh0aXRsZSA9ICJDYW50aWRhZCBkZSBwb3pvcyB0ZXJtaW5hZG9zIiwNCiAgICAgICBjYXB0aW9uID0gIlNlY3JldGFyw61hIGRlIEVuZXJnw61hIikNCmdncGxvdGx5KGdyYWZfcG96b3NfdGVybWluYWRvcywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojcG96b3MgaWFwZyAoYmFzZXMgYW51YWxlcykNCnBvem9faWFwZ18wNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDUueGxzIiwgDQogICAgc2tpcCA9IDEpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA1KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA2LnhscyIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwNikgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzA3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAwNy54bHMiLCANCiAgICBza2lwID0gMSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMDcpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18wOCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMDgueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDA4KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMDkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDA5LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAwOSkgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzEwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxMC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTApICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTIueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDEyKSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTMgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDEzLnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxMykgJT4lIA0KICBncm91cF9ieShPcGVyYWRvcikgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkNCg0KcG96b19pYXBnXzE0IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNC54bHMiLCANCiAgICBza2lwID0gMikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTQpICU+JSANCiAgZ3JvdXBfYnkoT3BlcmFkb3IpICU+JSANCiAgbXV0YXRlX2FsbChhcy5kb3VibGUpDQoNCnBvem9faWFwZ18xNSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTUueGxzIiwgDQogICAgc2tpcCA9IDIpICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE1KSAlPiUgDQogIGdyb3VwX2J5KE9wZXJhZG9yKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpwb3pvX2lhcGdfMTYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE2LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxNikNCg0KcG96b19pYXBnXzE3IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvUG96b3MvSUFQRy9QT1pPU1BFUkZPUkFET1NfMjAxNy54bHMiLCANCiAgICBza2lwID0gMikgICU+JSANCiAgbXV0YXRlKGFuaW8gPSAyMDE3KQ0KDQpwb3pvX2lhcGdfMTggPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Qb3pvcy9JQVBHL1BPWk9TUEVSRk9SQURPU18yMDE4LnhscyIsIA0KICAgIHNraXAgPSAyKSAgJT4lIA0KICBtdXRhdGUoYW5pbyA9IDIwMTgpDQoNCnBvem9faWFwZ18xOSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvUE9aT1NQRVJGT1JBRE9TXzIwMTkueGxzIiwgDQogICAgc2tpcCA9IDIpICAlPiUgDQogIG11dGF0ZShhbmlvID0gMjAxOSkgJT4lIA0KICByZW5hbWUoIlRvdGFsIFBvem9zIiA9ICJUb3RhbCBQb3pvcyBUZXJtaW5hZG9zIikNCg0KI3NlIG1lIGNvbGFyb24gYWxndW5hcyBmaWxhcyBkZSB0b3RhbGVzIHF1ZSBoYXkgcXVlIGJvcnJhcg0KcG96b3NfaWFwZyA8LSBwb3pvX2lhcGdfMDUgJT4lIA0KICBiaW5kX3Jvd3MocG96b19pYXBnXzA2LCBwb3pvX2lhcGdfMDcsIHBvem9faWFwZ18wOCwgcG96b19pYXBnXzA5LCANCiAgICAgICAgICAgIHBvem9faWFwZ18xMCwgcG96b19pYXBnXzEyLCBwb3pvX2lhcGdfMTMsIHBvem9faWFwZ18xNCwgcG96b19pYXBnXzE1LA0KICAgICAgICAgICAgcG96b19pYXBnXzE2LCBwb3pvX2lhcGdfMTcsIHBvem9faWFwZ18xOCwgcG96b19pYXBnXzE5KSAlPiUNCiAgcmVuYW1lKHRvdGFsX3Bvem9zID0gICJUb3RhbCBQb3pvcyIpICU+JSANCiAgZmlsdGVyKCEoT3BlcmFkb3IgJWluJSBjKCJUb3RhbGVzIiwgIlRPVEFMIikpICYgIShpcy5uYShPcGVyYWRvcikpICkgJT4lIA0KICBtdXRhdGUoZW1wcmVzYSA9Y2FzZV93aGVuKE9wZXJhZG9yID09ICJZUEYgUy5BLiIgfiAiWVBGIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEFOIEFNRVJJQ0FOIEVORVJHWSAoU1VDVVJTQUwgQVJHRU5USU5BKSBMTEMiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBBTiBBTUVSSUNBTiIgfiAiUEFFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJQRVNBIChQRVRST0JSQVMgRS5TLkEuKSIgfiAiUGV0cm9icmFzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVEVDUEVUUk9MIFMuQS4iIH4gIlRlY3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlBMVVNQRVRST0wgUy5BLiIgfiAiUGx1c3BldHJvbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIElOQyIgfiAiU2lub3BlYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIkNPTVBBw5HDjUEgR0VORVJBTCBERSBDT01CVVNUSUJMRVMgUy5BLiIgfiAiQ0dDIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJWSVNUQSBPSUwgJiBHQVMgQVJHRU5USU5BIFNBVSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJXSU5URVJTSEFMTCBFTkVSR0lBIFMuQS4iIH4gIldpbnRlcnNoYWxsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYWRvciA9PSAiRU5BUCBTSVBFVFJPTCBBUkdFTlRJTkEgUy5BLiIgfiAiRU5BUCBTSVBFVFJPTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIllTVVIgRU5FUkfDjUEgQVJHRU5USU5BIFMuUi5MLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFkb3IgPT0gIllTVVIgUEVUUk9MRVJBIEFSR0VOVElOQSBTLkEiIH4gIllTVVIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhZG9yID09ICJUT1RBTCBBVVNUUkFMIFMuQS4iIH4gIlRvdGFsIEF1c3RyYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBPcGVyYWRvcikpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGVtcHJlc2EpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdChlbXByZXNhLCBhbmlvLHRvdGFsX3Bvem9zKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGVtcHJlc2EpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX3Bvem9zID0gc3VtKHRvdGFsX3Bvem9zKSkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwb3pvc19pYXBnDQoNCmdyYWZfcG96b3NfaWFwZyA8LSBwb3pvc19pYXBnICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0b3RhbF9wb3pvcywgZmlsbCA9IGVtcHJlc2EpKSsNCiAgZ2VvbV9jb2woKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikrDQogIGxhYnModGl0bGUgPSAiUG96b3MgcGVyZm9yYWRvcyIsDQogICAgICAgY2FwdGlvbiA9ICJJQVBHIikNCmdncGxvdGx5KGdyYWZfcG96b3NfaWFwZywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNwb3pvcyBpYXBnIGFjdW11bGFkb3MNCnBvem9zX2lhcGdfY2VudGVuYXJpbyA8LSByZWFkX2RlbGltKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL1Bvem9zL0lBUEcvcG96b3NfaWFwZ19jZW50ZW5hcmlvLmNzdiIsICI7IiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICByZW5hbWUodG90YWxlcyA9IHRvdGFsZSkNCg0KZ3JhZl9wb3pvc19pYXBnX2NlbnRlbmFyaW8gPC0gcG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB0b3RhbGVzKSkrDQogIGdlb21fY29sKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBsYWJzKHRpdGxlID0gIlBvem9zIGVuIGV4dHJhY2Npw7NuIGRlZmluaXRpdmEiLA0KICAgICAgIGNhcHRpb24gPSAiSUFQRyIpDQpnZ3Bsb3RseShncmFmX3Bvem9zX2lhcGdfY2VudGVuYXJpbywgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KDQojIGNvbXBhcmFjaW9uIGRlIGZ1ZW50ZXMNCmNvbXBhcmFjaW9uX3Bvem9zIDwtIHBvem9zX2lhcGcgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19wZXJmb3JhZG9zX2lhcGcgPSBzdW0odG90YWxfcG96b3MsIG5hLnJtID0gVCkpICU+JSANCiAgcmlnaHRfam9pbihwb3pvc190ZXJtaW5hZG9zICU+JQ0KICAgICAgICAgICAgICAgZ3JvdXBfYnkoYW5pbykgJT4lIA0KICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX3Rlcm1pbmFkb3Nfc2VjX2VuZXJnaWEgPSBzdW0ocG96b3MsIG5hLnJtID0gVCkpKSAlPiUgDQogIHJpZ2h0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUgDQogICAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShhbmlvKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3NlY19lbmVyZ2lhID0gc3VtKHBvem9zLCBuYS5ybSA9IFQpKSkgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKHZhcmlhY2lvbl9wb3pvcyA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHRvdGFsZXMpKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHBvem9zX3ZhcmlhY2lvbl9pYXBnID0gdmFyaWFjaW9uX3Bvem9zKSkgDQoNCg0KZ3JhZl9wb3pvcyA8LSBjb21wYXJhY2lvbl9wb3pvcyAlPiUNCiAgZ2F0aGVyKGtleSA9ICJmdWVudGUiLA0KICAgICAgICAgdmFsdWUgPSAidmFsb3IiLA0KICAgICAgICAgMjpuY29sKC4pKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICAjIGdlb21fcG9pbnQoKSsNCiAgeWxpbSgwLCAxNzAwICkrDQogIGxhYnModGl0bGUgPSAiUG96b3MuIENvbXBhcmFjacOzbiBkZSBmdWVudGVzIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQ0KZ2dwbG90bHkoZ3JhZl9wb3pvcywgd2lkdGggPSA4MDAsIGhlaWdodCA9IDQwMCkNCmBgYA0KDQoNCnZlciByZWxhY2lvbmVzDQoqIFBCSSBoaWRyb2NhcmJ1cm9zIC8gUEJJIHRvdGFsICh2ZXIgY3VhbCBlbGVnaXIpDQoqIGNvcnJlZ2lyIG51ZXN0cm8gVkJQIGRlcHVyYW5kbyBzZXJ2aWNpb3MNCiogTUlQJ3MgY29lZiB0ZWNuaWNvIChwYXJhIHZlciBDSSBlbiBlbCBzZWN0b3IgcGV0cm9sZXJvIHkgcGVzbyBkZWwgc2VjdG9yIHBldHJvbGVybyBlbiBQQkkpDQoNCiogc3RvY2sgcGV0cm9sZXJvIC8gc3RvY2sgdG90YWwgSklDLEVNIA0KKiBTdG9jayBleHRyYWNjaW9uID0gUFB5RSBQQUUgKyBQUHlFIFRlY3AgKyBQUHlFIFBldHJvYnJhcyB1cHN0ciArIEFjdGl2byBZUEYgdXBzdHJlYW0NCiAgKiB2ZXIgcXVlIHBvcmNlbnRhamUgcXVlIHJlcHJlc2VudGFuIGVzdGFzIGVtcHJlc2FzIGVuIGxhIHByb2R1Y2Npb24gbyBwb3pvcyB5IHZlciBkZSBhbXBsaWFybG8gDQogICogdmVyIHJlbGFjaW9uIEFjdGl2byBZUEYgdXBzdHJlYW0gLyBQUHlFIGludGVncmFkYSBZUEYNCiAgKiB2ZXIgcmVsYWNpb24gZ2FuYW5jaWFzIEFGSVAgeSBCT0xTQVIgY29uIGVsIHN0b2NrIGNvcnJlc3BvbmRpZW50ZSAoY29oZXJlbmNpYSkgDQogICogdmVyIHJlbGFjaW9uIGNvbiBDb3JlbWJlcmcNCiAgKiBwYXNhciBFTkdFIA0KDQoqZ3JpbmJlcmcNCiAgKiBjb252ZXJ0aXIgbG8gbnVlc3RybyBhIGNvc3Rvcy4gYWdhcnJhciBudWVzdHJvcyB2YWxvciB5IGRpdmlkaXJsbyBwb3IgYmFycmlsZXMgKHN1bWFuZG8gZ2FzIGVuIEJPRSkNCiAgKiBjb3N0b3MgcG9yIGJibCwgcHJlY2lvIGVsIGJhcnJpbCB5IHByZWNpbyBkZSBwcm9kdWNjaW9uIChzdW1vIGxhIGdjaWEgbm9ybWFsIGFsIGNvc3RvMSkNCg0KDQojIyBBY3Rpdm9zDQoNClBhc2FyIGRhdG9zIGRlIGJzIGRlIHVzbyBlbiB5YWNpbWllbnRvcyBwYXJhIGFybWFyIHJlbGFjacOzbiBhY3Rpdm8geWFjaW1laW50by90b3RhbA0KDQpGdWVudGVzOg0KDQoqIEJhbGFuY2VzIGRlIEJvbHNhciAodW5pY2FtZW50ZSBlbXByZXNhcyBxdWUgY290aXphbiBlbiBsYSBib2xzYSBkZSB2YWxvcmVzIGFyZ2VudGluYSkuIFJldmlzYXIgZWwgc3RvY2sgZGVsIHNlY3RvciBkaXN0cmlidWNpw7NuIHBvcnF1ZSBzZSBwcmVzZW50YSBkZW1hc2lhZG8gZ3JhbmRlIGNvbiByZXNwZWN0byBhbCBkZSBsb3MgZGVtw6FzLiBGYWx0YSBwYXNhciBsb3MgZGF0b3MgZGVsIGFjdGl2byBkZSBjYXNpIHRvZGFzIGxhcyBlbXByZXNhcw0KKiBBRklQLiBDb24gZXN0YSBmdWVudGUgbm8gdGVuZW1vcyBjYWxjdWxvIGRlIHJlbnRhLCBzaW5vIHF1ZSBzb2xvIHVzYW1vcyBsYSBURyBjb21vIHBhcsOhbWV0cm8uIE5vdGE6ICJfYyIgc2lnbmlmaWNhIGNhc29zIHByZXNlbnRhZG9zIGRlIGxhIHZhcmlhYmxlIGNvcnJlc3BvbmRpZW50ZQ0KKiBNZW1vcmlhcyBkZSBZUEYuIExhIGTDqWNhZGEgZGUgbG9zIDgwIHByZXNlbnRhIHBpY29zIHF1ZSBoYXkgcXVlIHJldmlzYXINCg0KDQoqIENhbGN1bG8gZGVsIENhcGl0YWwgVG90YWwgQWRlbGFudGFkbyAoS1RBKSANCg0KICArIEJvbHNhcjogRXMgZXF1aXZhbGVudGUgYSBsYSBzdW1hIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcyBOZXRhIChkZXNjb250YW5kbyBsb3MgdGVycmVub3MgeSBvYnJhcyBlbiBjdXJzbykgeSBsb3MgSW52ZW50YXJpb3MuIEN1YW5kbyBsb3MgZGF0b3MgbG8gaGFiaWxpdGFuLCBzZSBsZSBhZ3JlZ8OzIGxvcyBzYWxhcmlvcyBhZGVsYW50YWRvcyAoc2FsYXJpb3MgeSBjYXJnYXMgY29uc3VtaWRvcyBzb2JyZSByb3RhY2nDs24pLiBMdWVnbywgY3VhbmRvIG5vIHNlIHByZXNlbnRhcm9uIGRhdG9zIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvcywgc2UgdG9tw7MgZWwgYWN0aXZvIG5vIGNvcnJpZW50ZS4NCiAgKyBBRklQOiBFcyBlcXVpdmFsZW50ZSBhIGxhIHN1bWEgZGUgQmllbmVzIGRlIFVzbywgQmllbmVzIGRlIENhbWJpbywgSW52ZW50YXJpb3MgeSBEaXNwb25pYmlsaWRhZGVzLg0KICArIE1lbW9yaWEgWVBGOiBTdW1hIGRlIEJpZW5lcyBkZSBVc28geSBCaWVuZXMgZGUgQ2FtYmlvDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBCT0xTQVINCg0KI3NlZ21lbnRvcyBkZSBZUEYgeSBQZXRyb2JyYXMNCnlwZl9zZWcgPC0gcmVhZF9kZWxpbSgiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci95cGZfc2VnbWVudG9zLmNzdiIsIA0KICAgICIsIiwgZXNjYXBlX2RvdWJsZSA9IEZBTFNFLCB0cmltX3dzID0gVFJVRSkgJT4lIA0KICBzZWxlY3QoLVgxKSAlPiUgDQogIG11dGF0ZShzZWN0b3IgPSBjYXNlX3doZW4oIHNlY3RvciA9PSAgInF1aW1pY2EiIH4gInBldHJvcXVpbWljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBzZWN0b3IpLA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpKQ0KDQpwZXRyb2JyYXNfYXJfc2VnIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcGV0cm9icmFzX2FyZ19zZWdtZW50b3MuY3N2IiwgDQogICAgIiwiLCBlc2NhcGVfZG91YmxlID0gRkFMU0UsIHRyaW1fd3MgPSBUUlVFKSU+JSANCiAgc2VsZWN0KC1YMSkNCg0KdW5pb25fc2VnbWVudG9zIDwtIHlwZl9zZWcgJT4lIA0KICBzZWxlY3QoYW5pbywgZW1wcmVzYSxzZWN0b3IsIHVuaWRhZCwgYWN0aXZvID0gYWN0aXZvcykgJT4lIA0KICBiaW5kX3Jvd3MocGV0cm9icmFzX2FyX3NlZyAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShhbmlvID0gZmVjaGEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8gLCBlbXByZXNhLCB1bmlkYWQsIHNlY3RvciwgcHJvcF9wbGFudGFfZXF1aXBvID0gcHB5ZSwgYWN0aXZvID0gYWN0aXZvcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDU6bmNvbCguKSkgJT4lDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9dmFsb3IvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIHNlbGVjdCgtaXBjXzE4KQ0KDQpzdG9ja19zZWdtZW50b3MgPC0gdW5pb25fc2VnbWVudG9zICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLCB2YXJpYWJsZSAsdW5pZGFkICkgJT4lIA0KICBzdW1tYXJpc2UodmFsb3IgPSBzdW0odmFsb3IsIG5hLnJtID0gVCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKGZ1ZW50ZSA9ICJBY3Rpdm8gZGUgWVBGIHkgUGV0cm9icmFzIiwNCiAgICAgICAgIHZhcmlhYmxlX3NlY3RvciA9IHBhc3RlKHZhcmlhYmxlLCBzZWN0b3IsIHNlcCA9ICIgIikpDQoNCg0KIyMgU3RvY2sgcG9yIGVtcHJlc2FzDQpzdG9ja19iYWxhbmNlc19lbXByZXNhcyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JSANCiAgZmlsdGVyKCAhKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiLA0KICAgICAgICAgYW5pbyA9IHllYXIoZmVjaGEpLA0KICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIpICU+JQ0KICBzZWxlY3QoYW5pbyxmdWVudGUsIGV2ZXJ5dGhpbmcoLiksIC1jKGZlY2hhLCBwYWlzLCB0Z19hbnQsIHRnX2Rlc3AsIHJvdGFjaW9uKSkgJT4lIA0KICAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDY6bmNvbCguKSkgJT4lIA0KICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvaXBjXzE4LA0KICAgICAgICAgZW1wcmVzYSA9IGNhc2Vfd2hlbihlbXByZXNhID09ICJwZXRyb2JyYXNfYXIiIH4gIlBldHJvYnJhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gInRlY3BldHJvbCIgfiAiVGVjcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiY2FtdXp6aV9wYW1wIiB+ICJDYW11enppIEdhcyBQYW1wZWFuYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIm1ldHJvZ2FzIiB+ICJNZXRyb2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBlbXByZXNhKSkgJT4lIA0KICBncm91cF9ieShhbmlvLCBlbXByZXNhLGZ1ZW50ZSwgc2VjdG9yLCB1bmlkYWQsIHZhcmlhYmxlKSAlPiUNCiAgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUNCiAgZmlsdGVyKHZhcmlhYmxlICVpbiUgYygiS1RBIiwgInBweWUiLCAicHB5ZV9uZXRhIiAsICJpbnZlbnRhcmlvcyIsICJhY3Rpdm9fbm9fY29yciIsICJhY3Rpdm8iKSkNCiAgICANCg0KDQojIyBTdG9jayBwb3IgcmFtYQ0Kc3RvY2tfYmFsYW5jZXNfcmFtYSA8LSAgc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19zZWdtZW50b3MgJT4lIA0KICAgICAgICAgICAgICAjIGZpbHRlcihzZWN0b3IgPT0gInVwc3RyZWFtIiAmIHZhcmlhYmxlID09ICJhY3Rpdm8iKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKHZhcmlhYmxlX3NlY3RvciA9PSAiYWN0aXZvIHVwc3RyZWFtIikgJT4lDQogICAgICAgICAgICAgIHNlbGVjdCgtdmFyaWFibGVfc2VjdG9yKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHNlY3RvciA9IGNhc2Vfd2hlbihzZWN0b3IgPT0gInVwc3RyZWFtIiB+ICJwcm9kdWNjaW9uIiksDQogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSA9ICBjYXNlX3doZW4odmFyaWFibGUgPT0gImFjdGl2byIgfiAicHB5ZSIpLA0KICAgICAgICAgICAgICAgICAgICAgZnVlbnRlID0gIkJvbHNhciIsDQogICAgICAgICAgICAgICAgICAgICBlbXByZXNhID0iWVBGIHkgUGV0cm9icmFzIikpICU+JSANCiAgZ3JvdXBfYnkoYW5pbywgc2VjdG9yLHZhcmlhYmxlLCB1bmlkYWQsIGZ1ZW50ZSkgJT4lDQogIHN1bW1hcmlzZSh2YWxvciA9IHN1bSh2YWxvciwgbmEucm0gPSBUKSkgIA0KICANCiAgIyBzcHJlYWQoa2V5ID0gc2VjdG9yLA0KICAjICAgICAgICB2YWx1ZSA9IEtUQSkgJT4lIA0KICAjIG11dGF0ZShpbnRlZ3JhZGFfeV9leHRyYWNjaW9uID0gaW50ZWdyYWRhICsgcHJvZHVjY2lvbiwNCiAgIyAgICAgICAgdmFyaWFibGUgPSAiS1RBIikgJT4lIA0KICAjIHJlbmFtZShleHRyYWNjaW9uID0gcHJvZHVjY2lvbikgJT4lIA0KICAjIHNlbGVjdChhbmlvLCB2YXJpYWJsZSwgbW9uZWRhLCBldmVyeXRoaW5nKC4pKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBUYXNhcyBkZSBkZXByZWNpYWNpb24NCiNBRklQDQp0YXNhX2RlcHJlY2lhY2lvbl9hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICU+JSANCiAgZ3JvdXBfYnkoIHJhbWEsIHllYXIpICU+JSANCiAgc3VtbWFyaXNlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uYnN1c28vYnN1c28pDQojQmFsYW5jZXMNCnJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgICAgICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKSAlPiUNCiAgICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgIGdyb3VwX2J5KGVtcHJlc2EpICU+JSANCiAgICBtdXRhdGUodGFzYV9kZXByZWNpYWNpb24gPSBkZXByZWNpYWNpb25lcy9wcHllKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgZW1wcmVzYSwgdGFzYV9kZXByZWNpYWNpb24pDQoNCg0KIyMjQUZJUA0KIyBTdG9jayBkZSBiYWxhbmNlcyAtICBBRklQDQpkYXRvc19hZmlwIDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL0RhdG9zL0FGSVAvZ2NpYV92OC54bHN4IiwgDQogICAgc2tpcCA9IDQpICU+JQ0KICBzZWxlY3QoLWMoNDk6bmNvbCguKSkpICAlPiUgDQogIHJlbmFtZShhbmlvID0geWVhciwNCiAgICAgICAgIGlkc2VjdG9yID0gaWRyYW1hKSAlPiUgDQogIG11dGF0ZSh1bmlkYWQgPSAicGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICBzZWN0b3IgPSBjYXNlX3doZW4oIHJhbWEgPT0gInBldHJvIiB+ICJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByYW1hID09ICJzZXJfcGV0cm8iIH4gInNlcnZpY2lvc19wZXRyb2xlcm9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiByYW1hKSklPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIGlkc2VjdG9yLCBzZWN0b3IsIGV2ZXJ5dGhpbmcoLiksIC1yYW1hKQ0KZGF0b3NfYWZpcA0KDQoNCnN0b2NrX2FmaXAgPC0gZGF0b3NfYWZpcCAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIGlkc2VjdG9yLCBzZWN0b3IsIHVuaWRhZCkgJT4lIA0KICBzdW1tYXJpc2UoS1RBID0gZGlzcG9uaWJpbGlkYWRlcyArIGJzY2FtYmlvICsgaW52ZW50YXJpb3MgKyBic3VzbywNCiAgICAgICAgICAgIHBweWUgPSBzdW0oYnN1c28sIG5hLnJtID0gVCksDQogICAgICAgICAgICBhY3Rpdm8gPSBzdW0oYWN0aXZvLCBuYS5ybSA9IFQpKSAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUoS1RBID0gKEtUQS8xMF42KSAvIGlwY18xOCwNCiAgICAgICAgIHBweWU9IChwcHllLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgYWN0aXZvPSAoYWN0aXZvLzEwXjYpIC8gaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSAlPiUgDQogIGFycmFuZ2UoaWRzZWN0b3IpICU+JSANCiAgZmlsdGVyKHNlY3RvciAlaW4lIGMoImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIiwgInNlcnZpY2lvc19wZXRyb2xlcm9zIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBzZWxlY3QoLWMoaWRzZWN0b3IsIGlwY18xOCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IHZhcmlhYmxlLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIkFGSVAiKQ0Kc3RvY2tfYWZpcA0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyANCiMgTWVtb3JpYXMgWVBGIA0KYmFsYW5jZV95cGYgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9FeGNlbHMgZGUgQmV0YW5pYS9DYWxjdWxvcyBCZXRhbmlhIFRnLnhscyIsIA0KICAgIHNoZWV0ID0gIllQRl9BICRIT1lfUEFSQURFRkxBQ1lDQUxDVUxBUiIsIA0KICAgIHNraXAgPSAxKSAlPiUgDQogIHNlbGVjdCgtYygxMjpuY29sKC4pKSkgJT4lIA0KICBtdXRhdGVfYWxsKGFzLmRvdWJsZSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIiwNCiAgICAgICAgIHVuaWRhZCA9IG1vbmVkYSwNCiAgICAgICAgIHZlbnRhcyA9ICJWZW50YXMuLi4zIiwNCiAgICAgICAgIGNvc3RvX3ZlbnRhcyA9ICJDb3N0byBkZSBsYXMgVmVudGFzLi4uNCIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhID0gIlV0aWxpZGFkIG5ldGEiLA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gIlV0aWxpZGFkIG9wZXJhdGl2YSIsDQogICAgICAgICBwcHllID0gIkJzIFVzbyIsDQogICAgICAgICBiaWVuZXNfZGVfY2FtYmlvID0gIkJzIENhbWJpbyIsDQogICAgICAgICB1dGlsaWRhZF9uZXRhX2FudGVzX2ltcHVlc3RvcyA9ICJVTiBhbnRlcyBkZSBpbXB1ZXN0b3MgKGfCtCBhY3Rpdm9zIHkgZGl2aWRlbmRvcykiLA0KICAgICAgICAgYWN0aXZvID0gIkFjdGl2byBUb3RhbCIsDQogICAgICAgICBwYXRyaW1vbmlvX25ldG8gPSAiUGF0cmltb25pbyBOZXRvIikgJT4lDQogIGZpbHRlcighKGlzLm5hKGFuaW8pKSkgJT4lDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyAgZGUgMjAxOCIsDQogICAgICAgICB2ZW50YXMgPXZlbnRhcy9pcGNfMTgsDQogICAgICAgICBjb3N0b192ZW50YXMgPSBjb3N0b192ZW50YXMvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfbmV0YSA9IHV0aWxpZGFkX25ldGEvaXBjXzE4LA0KICAgICAgICAgdXRpbGlkYWRfb3BlcmF0aXZhID0gdXRpbGlkYWRfb3BlcmF0aXZhL2lwY18xOCwNCiAgICAgICAgIHBweWUgPSBwcHllL2lwY18xOCwNCiAgICAgICAgIGJpZW5lc19kZV9jYW1iaW8gPSBiaWVuZXNfZGVfY2FtYmlvL2lwY18xOCwNCiAgICAgICAgIHV0aWxpZGFkX25ldGFfYW50ZXNfaW1wdWVzdG9zID0gdXRpbGlkYWRfbmV0YV9hbnRlc19pbXB1ZXN0b3MvaXBjXzE4LA0KICAgICAgICAgYWN0aXZvID0gYWN0aXZvL2lwY18xOCwNCiAgICAgICAgIHBhdHJpbW9uaW9fbmV0byA9IHBhdHJpbW9uaW9fbmV0by9pcGNfMTgsDQogICAgICAgICBLVEEgPSBwcHllICsgYmllbmVzX2RlX2NhbWJpbywNCiAgICAgICAgIHNlY3RvciA9ICJNZW1vcmlhIGRlIFlQRiIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHNlY3RvciwgdW5pZGFkLCBldmVyeXRoaW5nKC4pKSANCmJhbGFuY2VfeXBmDQoNCnN0b2NrX3lwZiA8LSBiYWxhbmNlX3lwZiAlPiUgDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgNDpuY29sKC4pKSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSAlPiUgDQogIG11dGF0ZSh2YWxvciA9IGNhc2Vfd2hlbihhbmlvID09IDE5ODMgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg1IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPT0gMTk4NiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID09IDE5ODcgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbyA9PSAxOTg4IH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YWxvcikpICU+JQ0KICBiaW5kX3Jvd3Moc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lIA0KICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgc2VsZWN0KGFuaW8sICBzZWN0b3IgPWVtcHJlc2EsIHVuaWRhZCwgdmFyaWFibGUsIHZhbG9yICkgJT4lIA0KICAgIGZpbHRlcihzZWN0b3IgPT0gIllQRiIsDQogICAgICAgICAgIHZhcmlhYmxlICAlaW4lIGMoIktUQSIsICJhY3Rpdm8iLCAicHB5ZSIpKSkNCiAgDQoNCmBgYA0KDQojIyMgU3RvY2sgdG90YWwgZGUgbGEgcmFtYSANCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFN0b2NrIGRlIGxhIHJhbWENCnN0b2NrX3JhbWEgPC0gc3RvY2tfYWZpcCAlPiUgDQogIGJpbmRfcm93cyhzdG9ja19iYWxhbmNlc19yYW1hKQ0KDQojIHdyaXRlLmNzdihzdG9ja19yYW1hLCBmaWxlID0iL0FyY2hpdm9zL0RhdG9zL1N0b2NrL3N0b2NrX2hpZHJvY2FyYnVyb3MuY3N2IikNCg0KDQpncmFmX3N0b2NrX3JhbWEgPC0gc3RvY2tfcmFtYSAlPiUgDQogICMgbXV0YXRlKHZhbG9yID0gbnVtYmVyX2Zvcm1hdCh2YWxvciwgYmlnLm1hcmsgPSAiICIgKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSBzZWN0b3IsIHNoYXBlID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KHNpemUgPSAuOCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIGFkZWxhbnRhZG8geSBhY3Rpdm8gZGUgc2VnbWVudG9zIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdWJzZWN0b3JlcyBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvIiwNCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBmYWNldF93cmFwKH4gdmFyaWFibGUgKQ0KDQpnZ3Bsb3RseShncmFmX3N0b2NrX3JhbWEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KDQojIyMgU3RvY2sgZGUgc2VnbWVudG9zIGRlIFlQRiB5IFBldHJvYnJhcw0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfc3RvY2tfc2VnbWVudG9zIDwtIHVuaW9uX3NlZ21lbnRvcyAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrDQogIGdlb21fbGluZSgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiU3RvY2sgZGUgY2FwaXRhbCBkZSBzZWdtZW50b3MiLA0KICAgICAgIHN1YnRpdGxlID0gIllQRiB5IFBldHJvYnJhcyBBcmdlbnRpbmEiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGZhY2V0X3dyYXAodmFyaWFibGUgfiBlbXByZXNhICkNCg0KZ2dwbG90bHkoZ3JhZl9zdG9ja19zZWdtZW50b3MsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBTdG9jayBwb3IgZW1wcmVzYXMNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja19lbXAgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIGZpbHRlcigNCiAgICAjIHZhcmlhYmxlICVpbiUgYygiS1RBIiwgImFjdGl2byIpLA0KICAgICAgICAgc2VjdG9yICE9ICJkaXN0cmlidWNpb24iKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJTdG9jayBkZSBjYXBpdGFsIHBvciBlbXByZXNhIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja19lbXAsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCg0KYGBgDQoNCiMjIyBZUEYgbGFyZ28gcGxhem8NCkNvbXBhcmFjacOzbiBlbnRyZSBsYSBNZW1vcmlhIFlQRiAocmVjb3BpbGFkbyBwb3IgQkZSKSB5IGxvcyBiYWxhbmNlcyBleHRyw61hZG9zIGRlIEJvbHNhcg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KZ3JhZl9zdG9ja195cGYgPC0gIHN0b2NrX3lwZiAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIlN0b2NrIGRlIGNhcGl0YWwgZGUgWVBGIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlKQ0KZ2dwbG90bHkoZ3JhZl9zdG9ja195cGYsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA1MDApDQoNCmBgYA0KDQojIyMgRXN0aW1hY2nDs24gZGUgc3RvY2sgZGUgY2FwaXRhbCBhIHBhcnRpciBkZSBsYSBldm9sdWNpw7NuIGRlIHBvem9zIHBlcmZvcmFkb3MNCg0KDQpFbCBlamVyY2ljaW8gY29uc2lzdGUgZW4gdmVyaWZpY2FyIHNpIGxvcyBwb3pvcyB0ZXJtaW5hZG9zIHNpcnZlbiBjb21vIGluZGljYWRvciBkZSBsYSBpbnZlcnNpw7NuIHksIHBvciBsbyB0YW50bywgZGUgYXByb3hpbWFkb3IgYWwgc3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvLiBQYXJhIGVsbG8gc2UgcGFydGUgZGUgdW4gYcOxbyBiYXNlIGRlIGxhIHNlcmllIGRlIFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24gZGUgQm9sc2FyIHkgQUZJUCwgcGFyYSBsdWVnbyBpbmRleGFyIGxhcyB2YXJpYWJsZXMgcG9yIGxhIGV2b2x1Y2nDs24gZGUgbG9zIHBvem9zLiBMb3MgYmFsYW5jZXMgZGUgQm9sc2FyIHF1ZSBjb3JyZXNwb25kZW4gw7puaWNhbWVudGUgYSBleHRyYWNjacOzbiBzb24gZG9zOiBQQUUgeSBUZWNwZXRyb2wsIHBvciBsbyBxdWUgZWwgdmFsb3Igb2J0ZW5pZG8gcHVlZGUgZXN0YXIgc3VicmVwcmVzZW50YWRvIHBhcmEgZGFyIGN1ZW50YSBkZWwgdG90YWwgZGUgbGEgcmFtYS4gQ29uIHJlc3BlY3RvIGFsIMOtbmRpY2UgZGUgcG96b3MsIHNlIHRvbWFyb24gZG9zIHNlcmllcyBhbHRlcm5hdGl2YXM6IHVuYSBjb25zdHJ1w61kYSBhIHBhcnRpciBkZWwgc3RvY2sgZGUgcG96b3MgZW4gZXh0cmFjY2nDs24gZWZlY3RpdmEgKGZ1ZW50ZTogSUFQRykgeSBvdHJhIGVsYWJvcmFkYSBjb24gbG9zIHBvem9zIHRlcm1pbmFkb3MgYW51YWxlcyBjYXJnYWRvcyBwb3IgZW1wcmVzYSBvcGVyYWRvcmEgKGZ1ZW50ZTogU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEpLiAgDQoNCkVsIGHDsW8gYmFzZSBlbGVnaWRvIGVzIDIwMDYsIGRhZG8gcXVlIGVzIGVsIMO6bHRpbW8gZGF0byBxdWUgcG9zZWVtb3MgZGVsIHN0b2NrIGRlIHBvem9zIHRvdGFsZXMgZW4gYWN0aXZpZGFkIGRlIElBUEcuDQoNClNlIHJlYWxpesOzIGxhIG1pc21hIGVzdGltYWNpw7NuIHBhcmEgWVBGLCBmaWx0cmFuZG8gbGFzIHZhcmlhYmxlcyBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyAocGFyYSBlbCB0b3RhbCBkZSBsYSBlbXByZXNhLCBwb3IgbG8gcXVlIGluY2x1eWUgbm8gc8OzbG8gZXh0cmFjY2nDs24gc2lubyByZWZpbmFjacOzbiB5IG90cm9zIHJ1YnJvcykgeSBhY3Rpdm8gdG90YWwgZGVsIHVwc3RyZWFtLiBTZSB1dGlsaXrDsyDDum5pY2FtZW50ZSBlbCBpbmRpY2UgZGUgcG96b3MgdGVybWluYWRvcyBhbnVhbGVzIGRlIFlQRiBwYXJhIGVzdGltYXIgbGEgUFB5RSB5IGVsICBhY3Rpdm8sIGRhZG8gcXVlIG5vIHNlIHBvc2VlIHZhbG9yZXMgZGVsIHN0b2NrIGRlIHBvem9zIGVuIHBlcmZvcmFjacOzbiBwYXJhIGxvcyBhw7FvcyBlbiBkb25kZSBleGlzdGVuIHZhbG9yZXMgY29udGFibGVzIHF1ZSBzaXJ2YW4gZGUgYcOxbyBiYXNlLiBMdWVnbywgc2UgZXN0aW3DsyB1biBzdG9jayBkZSBjYXBpdGFsIHRvdGFsIGRlIHJhbWEgYSBwYXJ0aXIgZGUgcG9uZGVyYXIgZWwgc3RvY2sgZGUgWVBGIHBvciBsYSByZWxhY2nDs24gZW50cmUgbG9zIHBvem9zIGRlIFlQRiB5IGxvcyBwb3pvcyB0b3RhbGVzIGRlIGxhIHJhbWEuDQoNCg0KRW4gc8OtbnRlc2lzLCBlbCBsaXN0YWRvIGRlIHZhcmlhYmxlcyBlc3RpbWFkYXMtIGEgcGFydGlyIGRlIGxhcyBkb3Mgc2VyaWVzIGRlIHBvem9zIChzdG9jayB5IGZsdWpvKSxzYWx2byBwYXJhIGxhIGVzdGltYWNpw7NuIGRlIFlQRiBxdWUgc29sbyBzZSBwdWRvIGhhY2VyIGNvbiBmbHVqbyBkZSBwb3pvcyBwb3IgYXVzZW5jaWEgZGUgaW5mb3JtYWNpw7NuLSBlcyBsYXMgc2lndWllbnRlczoNCg0KKiAkcHB5ZVxfZXN0aW1hZG9cX2JvbHNhciQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEJvbHNhciQgKiAkaW5kaWNlXCBkZVwgcG96b3MkDQoqICRwcHllXF9lc3RpbWFkb1xfYWZpcCQgPSAkUFB5RVwgYcOxb1wgYmFzZVwgZGVcIEFGSVAkICogJGluZGljZVwgZGVcIHBvem9zJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfeXBmJCA9ICRQUHlFXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW1cX3lwZiQgPSAkQWN0aXZvXCBhw7FvXCBiYXNlXCBkZVwgWVBGJCAqICRpbmRpY2VcIGRlXCBwb3pvc1wgWVBGJA0KDQoqICRwcHllXF9lc3RpbWFkb1xfdG90YWwkID0gJHBweWVcX2VzdGltYWRvXF95cGYkICogJCRcZnJhY3twb3pvc1wgdG90YWxlc317cG96b3NcIGRlXCBZUEZ9JCQNCg0KKiAkYWN0aXZvXF9lc3RpbWFkb1xfdXBzdHJlYW0kID0gJGFjdGl2b1xfZXN0aW1hZG9cX3Vwc3RyZWFtXF95cGYkICAqICQkXGZyYWN7cG96b3NcIHRvdGFsZXN9e3Bvem9zXCBkZVwgWVBGfSQkDQoNClBhcmEgcG9kZXIgc2VsZWNjaW9uYXIgbGEgZXN0aW1hY2nDs24gbcOhcyBhZGVjdWFkYSwgc2UgcmVhbGl6w7MgdW4gYW7DoWxpc2lzIGRlIGNvcnJlbGFjacOzbiBlbnRyZSB0b2RhcyBsYXMgc2VyaWVzIGVzdGltYWRhcyB5IGxvcyB2YWxvcmVzIGNvbnRhYmxlcyBxdWUgc2UgcG9zZWVuIGRlIFBQeUUgZGUgQUZJUCwgQm9sc2FyIGUgWVBGLiBTZSBwcmVzZW50YW4gZGlzdGludG9zIGN1YWRyb3MgZGUgY29ycmVsYWNpb25lcywgY29uIHN1cyBuaXZsZXMgZGUgc2lnbmlmaWNhbmNpYSwgZGlhZ3JhbWFzIGRlIGRpc3BlcnNpw7NuIGVudHJlIHZhcmlhYmxlcyB5IHN1IGRpc3RyaWJ1Y2nDs24uIExhcyBzZXJpZXMgY29uc3RydcOtZGFzIHF1ZSBwb3NlZW4gbWVqb3IgY29ycmVsYWNpw7NuIHNvbiBsYSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyBhIHBhcnRpciBkZSBCb2xzYXIgZXN0aW1hZGFzIGNvbiDDrW5kaWNlIGRlIHN0b2NrIGRlIHBvem9zIChjb3JyZWxhY2nDs24gZnVlcnRlIGRlIDAuODkgeSBzaWduaWZpY2F0aXZhIGFsIDAuMDAxKSB5IGZsdWpvIGRlIHBvem9zIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC41NCB5IHNpZ25pZmljYXRpdmEgYWwgMC4wNSkgeSBsdWVnbyBlbCBhY3Rpdm8gZGVsIHVwc3RyZWFtIHRvdGFsIGRlIGxhIHJhbWEgYSBwYXJ0aXIgZGUgWVBGIChjb3JyZWxhY2nDs24gbW9kZXJhZGEgZGUgMC40MiB5IHNpZ25pZmljYXRpdmEgYWwgMC4xIGNvbiBsb3MgdmFsb3JlcyBjb250YWJsZXMgZGUgWVBGIHkgY29ycmVsYWNpw7NuIGZ1ZXJ0ZSBkZSAwLjg4IHkgc2lnbmlmaWNhdGl2YSBhbCAwLjAwMSBjb24gbGFzIGVzdGltYWNpb25lcyBkZSBQUHlFIGRlIEFGSVAgeSBCb2xzYXIgYSBwYXJ0aXIgZGUgZmx1am8gZGUgcG96b3MpLg0KDQpsYSBlc3RpbWFjacOzbiB0aWVuZSBxdWUgcmVhbGl6YXJzZSBjb24gUFB5RSBwb3JxdWUgaGF5IHF1ZSBleGNsdWlyIHNhbGFyaW9zIGUgaW52ZW50YXJpb3MgKHF1ZSBlc3TDoW4gZW4gS1RBKQ0KDQojIyMjIEFuw6FsaXNpcyBkZSBjb3JyZWxhY2lvbiBlbnRyZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyB5IFBvem9zIGVuIHByb2R1Y2Npw7NuDQoNCg0KcmVlbXBsYXphciBpcGMgcG9yIHVuIGliaWYgbyBpbmRpY2UgZXNwZWNpZmljbw0KDQojIyMjIyBUb3RhbCByYW1hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpzdG9ja195X3Bvem9zX3Rhc2FzIDwtIHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHZhbG9yLGZ1ZW50ZSkgJT4lDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBzcHJlYWQoa2V5ID0gZnVlbnRlLCB2YWx1ZSA9IHZhbG9yKSAlPiUgDQogIG11dGF0ZShBRklQID0gdmFyaWFjaW9uX2ludGVyYW51YWwoQUZJUCksDQogICAgICAgICBCb2xzYXIgPSB2YXJpYWNpb25faW50ZXJhbnVhbChCb2xzYXIpKSAlPiUgDQogIGZ1bGxfam9pbihjb21wYXJhY2lvbl9wb3pvcyANCiAgICAgICAgICAgICU+JQ0KICAgICAgICAgICAgIyBzZWxlY3QoLSBwb3pvc19wZXJmb3JhZG9zX2lhcGcpDQogICAgICAgICAgICBzZWxlY3QoLSBwb3pvc192YXJpYWNpb25faWFwZykNCiAgICAgICAgICAgICwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyLA0KICAgICAgICAgcG96b3NfaWFwZyA9IHBvem9zX3BlcmZvcmFkb3NfaWFwZywNCiAgICAgICAgICMgcG96b3NfaWFwZ19jZW50ZW5hcmlvID0gcG96b3NfdmFyaWFjaW9uX2lhcGcsDQogICAgICAgICBwb3pvc190ZXJtaW5hZG9zID0gcG96b3NfdGVybWluYWRvc19zZWNfZW5lcmdpYSwNCiAgICAgICAgIHBvem9zX2NhcmdhZG9zID0gcG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEgKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvID4gMTk5OCkgJT4lDQogIHNlbGVjdCgtYW5pbykgJT4lDQogIG11dGF0ZV9hbGwodGFzYV9jcmVjaW1pZW50bykgIA0KICANCg0KDQpHR2FsbHk6OmdncGFpcnMoc3RvY2tfeV9wb3pvc190YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHN0b2NrX3lfcG96b3NfdGFzYXMpDQoNCiMgcm91bmQodmFyKHN0b2NrX3lfcG96b3NfdGFzYXMsIG5hLnJtID0gVFJVRSksIDQpDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojbWF0cml6IGRlIGNvcnJlbGFjaW9uDQpjb3JfcG96b3MgPC0gY29yKHN0b2NrX3lfcG96b3NfdGFzYXMsIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KY29yX3Bvem9zDQoNCiMgIGRpc3RpbnRvcyBjb3JyZWxvZ3JhbWFzDQojY29uIGdnY29ycnBsb3QNCmxpYnJhcnkoZ2djb3JycGxvdCkNCnAubWF0ID0gY29yX3BtYXQoc3RvY2tfeV9wb3pvc190YXNhcykNCmdnY29ycnBsb3QoY29yX3Bvem9zLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCiMgIyAjY29uIGNvcnJwbG90DQojIGNvbCA8LSBjb2xvclJhbXBQYWxldHRlKGMoIiNCQjQ0NDQiLCAiI0VFOTk4OCIsICIjRkZGRkZGIiwgIiM3N0FBREQiLCAiIzQ0NzdBQSIpKQ0KIyBjb3JycGxvdDo6Y29ycnBsb3QoY29yX3Bvem9zLCBtZXRob2Q9ImNvbG9yIiwgY29sPWNvbCgyMDApLA0KIyAgICAgICAgICB0eXBlPSJ1cHBlciIsIG9yZGVyPSJoY2x1c3QiLA0KIyAgICAgICAgICBhZGRDb2VmLmNvbCA9ICJibGFjayIsICMgQWRkIGNvZWZmaWNpZW50IG9mIGNvcnJlbGF0aW9uDQojICAgICAgICAgIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUsICNUZXh0IGxhYmVsIGNvbG9yIGFuZCByb3RhdGlvbg0KIyAgICAgICAgICAjIENvbWJpbmUgd2l0aCBzaWduaWZpY2FuY2UNCiMgICAgICAgICAgIyBwLm1hdCA9IHAubWF0LA0KIyAgICAgICAgICAjIGluc2lnID0gImJsYW5rIiwNCiMgICAgICAgICAgc2lnLmxldmVsID0gMC4wMSkNCg0KIyAjICNjb24gZ2dnYWxseQ0KIyBHR2FsbHk6OmdnY29ycihzdG9ja195X3Bvem9zX3Rhc2FzLCBtZXRob2QgPSBjKCJjb21wbGV0ZS5vYnMiLCAicGVhcnNvbiIpICwNCiMgICAgICAgICAgICAgICAgbGFiZWwgPSBULCBsYWJlbF9yb3VuZCA9IDIpDQpgYGANCg0KYGBge3J9DQojYcOxb3MgYmFzZSAyMDA2DQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gKHN0b2NrX3JhbWEgJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yID09ICJwcm9kdWNjaW9uIikgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHBweWUgPSB2YWxvcikpDQpwcHllX2FuaW9fYmFzZV9ib2xzYXIgPC0gcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJHBweWVbcHB5ZV9hbmlvX2Jhc2VfYm9sc2FyJGFuaW8gPT0yMDA2XQ0KDQojIHZhbG9yX2Jhc2UgPC0gc2VyaWVbd2hpY2goZmVjaGE9PWZlY2hhX2Jhc2UpXQ0KDQpwcHllX2FuaW9fYmFzZV9hZmlwIDwtIChzdG9ja19yYW1hICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIiAmIHNlY3RvciA9PSAiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiKSAlPiUNCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHB5ZSA9IHZhbG9yKSkNCnBweWVfYW5pb19iYXNlX2FmaXAgPC0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCRwcHllW3BweWVfYW5pb19iYXNlX2FmaXAkYW5pbyA9PSAyMDA2XQ0KDQoNCnN0b2NrX3lfcG96b3MgPC0gIGNvbXBhcmFjaW9uX3Bvem9zICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wb3pvLA0KICAgICAgICAgdmFsdWUgPSBjYW50aWRhZF9wb3pvcywNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lDQogIGFycmFuZ2UoZnVlbnRlX3Bvem8sYW5pbykgJT4lIA0KICBncm91cF9ieShmdWVudGVfcG96bykgJT4lIA0KICBtdXRhdGUoaW5kaWNlX3Bvem9zXzA2ID0gZ2VuZXJhcl9pbmRpY2Uoc2VyaWU9IGNhbnRpZGFkX3Bvem9zICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWNoYSA9IGFuaW8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDYpKSAlPiUgDQogICMgbGVmdF9qb2luKHN0b2NrX3JhbWEgJT4lICANCiAgIyAgICAgICAgICAgICBmaWx0ZXIodmFyaWFibGUgPT0gInBweWUiICYgc2VjdG9yICVpbiUgYygiZXh0cmFjY2lvbl9wZXRyb2xlb19nYXMiLCAicHJvZHVjY2lvbiIpKSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHB5ZSA9IHZhbG9yLCBmdWVudGVfc3RvY2sgPSBmdWVudGUpLCBieSA9ICJhbmlvIikgJT4lIA0KICBtdXRhdGUocHB5ZV9hZmlwID0gcHB5ZV9hbmlvX2Jhc2VfYWZpcCAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIHBweWVfYm9sc2FyID1wcHllX2FuaW9fYmFzZV9ib2xzYXIgKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGZ1ZW50ZV9wcHllLA0KICAgICAgICAgdmFsdWUgPSBwcHllX2VzdGltYWRvLA0KICAgICAgICAgNTo2KQ0Kc3RvY2tfeV9wb3pvcw0KDQpnZ3Bsb3RseShzdG9ja195X3Bvem9zICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLHBweWVfZXN0aW1hZG8gLCBjb2xvciA9IGZ1ZW50ZV9wb3pvKSkrDQogIGdlb21fbGluZSgpKw0KICBsYWJzKHk9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikrDQogIGZhY2V0X3dyYXAofmZ1ZW50ZV9wcHllICAgICksDQogICAgd2lkdGggPSA4MDAsIGxlbmd0aCA9NTAwKQ0KDQojc3RvY2sgZXN0aW1hZG8gYSBwYXJ0aXIgZGUgcG96b3MNCnN0b2NrX2VzdGltYWRvIDwtIHN0b2NrX3lfcG96b3MgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIoZnVlbnRlX3Bvem8gPT0icG96b3NfY2FyZ2Fkb3Nfc2VjX2VuZXJnaWEiLCBmdWVudGVfcHB5ZSA9PSJwcHllX2JvbHNhciIpICU+JSANCiAgcmVuYW1lKHVuaWRhZCA9IHVuaWRhZF9wcHllLCB2YWxvciA9cHB5ZV9lc3RpbWFkbykgJT4lIA0KICBzZWxlY3QoLWMoY2FudGlkYWRfcG96b3MsIGluZGljZV9wb3pvc18wNiwgZnVlbnRlX3Bvem8pKQ0KDQoNCiNkaWZlcmVuY2lhIGVudHJlIHBweWUgZXN0aW1hZGEgeSB2YWxvciBjb250YWJsZSBkZSBib2xzYXINCnN0b2NrX2VzdGltYWRvICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX3JhbWEgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlPT0iQm9sc2FyIiwgdmFyaWFibGUgPT0icHB5ZSIsIHNlY3RvciA9PSAicHJvZHVjY2lvbiIpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHB5ZV9ib2xzYXIgPSB2YWxvcikpICU+JSANCiAgbmEub21pdCgpICU+JSANCiAgbXV0YXRlKGRpZmYgPSAodmFsb3IvcHB5ZV9ib2xzYXIgLTEpKjEwMCkNCg0KI2NhbWJpbyBzdG9jayBzb2xvIHBhcmEgbG9zIGHDsW9zIHF1ZSB0ZW5lbW9zIEJPTFNBUg0Kc3RvY2tfZXN0aW1hZG8gPC0gc3RvY2tfcmFtYSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihmdWVudGUgJWluJSBjKCJCb2xzYXIiLCAiQUZJUCIpLCB2YXJpYWJsZSA9PSJwcHllIiwgDQogICAgICAgICAgICAgICAgICAgICBzZWN0b3IgJWluJSBjKCJwcm9kdWNjaW9uIiwgImV4dHJhY2Npb25fcGV0cm9sZW9fZ2FzIikpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCxmdWVudGVfcHB5ZT1mdWVudGUgLCB2YWxvcikNCiAgDQogIA0KYGBgDQoNCg0KIyMjIyMjIFN0b2NrIGRlIHBvem9zDQpgYGB7cn0NCnN0b2NrX3lfcG96b3NfdGFzYXNfdjIgPC0gc3RvY2tfcmFtYSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBzZWN0b3IgJWluJSBjKCJleHRyYWNjaW9uX3BldHJvbGVvX2dhcyIsICJwcm9kdWNjaW9uIikpICU+JQ0KICBzZWxlY3QoYW5pbywgdmFsb3IsZnVlbnRlKSAlPiUNCiAgc3ByZWFkKGtleSA9IGZ1ZW50ZSwgdmFsdWUgPSB2YWxvcikgJT4lIA0KICBmdWxsX2pvaW4ocG96b3NfaWFwZ19jZW50ZW5hcmlvJT4lDQogICAgICAgICAgICBzZWxlY3QoYW5pbywgcG96b3NfaWFwZyA9IHRvdGFsZXMgKSwgYnkgPSAiYW5pbyIpICU+JQ0KICByZW5hbWUocHB5ZV9hZmlwID0gQUZJUCwNCiAgICAgICAgIHBweWVfYm9sc2FyID0gQm9sc2FyICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pICU+JQ0KICBmaWx0ZXIoYW5pbyA+IDE5OTgpICU+JQ0KICBzZWxlY3QoLWFuaW8pICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pICANCiAgDQoNCg0KR0dhbGx5OjpnZ3BhaXJzKHN0b2NrX3lfcG96b3NfdGFzYXNfdjIsIGxvd2VyID0gbGlzdChjb250aW51b3VzID0gInNtb290aCIpKQ0KcGxvdChzdG9ja195X3Bvem9zX3Rhc2FzX3YyKQ0KDQojIHJvdW5kKHZhcihzdG9ja195X3Bvem9zX3Rhc2FzLCBuYS5ybSA9IFRSVUUpLCA0KQ0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KI21hdHJpeiBkZSBjb3JyZWxhY2lvbg0KY29yX3Bvem9zIDwtIGNvcihzdG9ja195X3Bvem9zX3Rhc2FzX3YyLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvcw0KDQojICBkaXN0aW50b3MgY29ycmVsb2dyYW1hcw0KI2NvbiBnZ2NvcnJwbG90DQpsaWJyYXJ5KGdnY29ycnBsb3QpDQpwLm1hdCA9IGNvcl9wbWF0KHN0b2NrX3lfcG96b3NfdGFzYXMpDQpnZ2NvcnJwbG90KGNvcl9wb3pvcywgaGMub3JkZXIgPSBUUlVFLA0KICAgIHR5cGUgPSAibG93ZXIiLCBwLm1hdCA9IHAubWF0LCBsYWIgPSBUKQ0KDQojICMgI2NvbiBjb3JycGxvdA0KIyBjb2wgPC0gY29sb3JSYW1wUGFsZXR0ZShjKCIjQkI0NDQ0IiwgIiNFRTk5ODgiLCAiI0ZGRkZGRiIsICIjNzdBQUREIiwgIiM0NDc3QUEiKSkNCiMgY29ycnBsb3Q6OmNvcnJwbG90KGNvcl9wb3pvcywgbWV0aG9kPSJjb2xvciIsIGNvbD1jb2woMjAwKSwNCiMgICAgICAgICAgdHlwZT0idXBwZXIiLCBvcmRlcj0iaGNsdXN0IiwNCiMgICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLCAjIEFkZCBjb2VmZmljaWVudCBvZiBjb3JyZWxhdGlvbg0KIyAgICAgICAgICB0bC5jb2w9ImJsYWNrIiwgdGwuc3J0PTQ1LCAjVGV4dCBsYWJlbCBjb2xvciBhbmQgcm90YXRpb24NCiMgICAgICAgICAgIyBDb21iaW5lIHdpdGggc2lnbmlmaWNhbmNlDQojICAgICAgICAgICMgcC5tYXQgPSBwLm1hdCwNCiMgICAgICAgICAgIyBpbnNpZyA9ICJibGFuayIsDQojICAgICAgICAgIHNpZy5sZXZlbCA9IDAuMDEpDQoNCiMgIyAjY29uIGdnZ2FsbHkNCiMgR0dhbGx5OjpnZ2NvcnIoc3RvY2tfeV9wb3pvc190YXNhcywgbWV0aG9kID0gYygiY29tcGxldGUub2JzIiwgInBlYXJzb24iKSAsDQojICAgICAgICAgICAgICAgIGxhYmVsID0gVCwgbGFiZWxfcm91bmQgPSAyKQ0KYGBgDQoNCg0KIyMjIyMgWVBGDQpgYGB7cn0NCnBweWVfeXBmIDwtIHlwZl9zZWcgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICA9PSAidXBzdHJlYW0iICkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IHllYXIoZmVjaGEpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgaXBjXzE4KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gImFjdGl2b191cHN0cmVhbV95cGYiLA0KICAgICAgICAgYWN0aXZvcyA9IGFjdGl2b3MvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIHVuaWRhZCAsICBhY3Rpdm9fdXBzdHJlYW09IGFjdGl2b3MpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIGZpbHRlcih2YXJpYWJsZSA9PSAicHB5ZSIgJiBlbXByZXNhID09ICJZUEYiKSAlPiUNCiAgICBzZWxlY3QoYW5pbywgZW1wcmVzYSwgdW5pZGFkLCBwcHllX2ludGVncmFkYSA9dmFsb3IpICwgYnkgPSBjKCJhbmlvIiwgImVtcHJlc2EiLCAidW5pZGFkIikpICU+JSANCiAgbXV0YXRlKGFjdGl2b191cHN0cmVhbSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKGFjdGl2b191cHN0cmVhbSksDQogICAgICAgICBwcHllX2ludGVncmFkYSA9IHZhcmlhY2lvbl9pbnRlcmFudWFsKHBweWVfaW50ZWdyYWRhKSkgJT4lIA0KICBmdWxsX2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1lbXByZXNhKSAlPiUgDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihpZGVtcHJlc2EgPT0gIllQRiIpICU+JSANCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8sIGVtcHJlc2EgPSBpZGVtcHJlc2EpLCBieSA9IGMoImFuaW8iLCAiZW1wcmVzYSIpICkgJT4lIA0KICBhcnJhbmdlKGFuaW8pDQpwcHllX3lwZg0KDQpwcHllX3lwZl90YXNhcyA8LSBwcHllX3lwZiAlPiUNCiAgIGFycmFuZ2UoYW5pbykgJT4lDQogIGZpbHRlcihhbmlvICVpbiUgMTk5ODoyMDE4KSAlPiUNCiAgc2VsZWN0KC1jKGFuaW8sIGVtcHJlc2EsIHVuaWRhZCkpICU+JQ0KICBtdXRhdGVfYWxsKHRhc2FfY3JlY2ltaWVudG8pDQoNCiNtYXRyaXogZGUgY29ycmVsYWNpb24NCmNvcl9wb3pvc195cGYgPC0gY29yKHBweWVfeXBmX3Rhc2FzLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmNvcl9wb3pvc195cGYNCg0KIyAgZGlzdGludG9zIGNvcnJlbG9ncmFtYXMNCiNjb24gZ2djb3JycGxvdA0KcC5tYXQgPSBjb3JfcG1hdChjb3JfcG96b3NfeXBmKQ0KZ2djb3JycGxvdChjb3JfcG96b3NfeXBmLCBoYy5vcmRlciA9IFRSVUUsDQogICAgdHlwZSA9ICJsb3dlciIsIHAubWF0ID0gcC5tYXQsIGxhYiA9IFQpDQoNCkdHYWxseTo6Z2dwYWlycyhwcHllX3lwZl90YXNhcywgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpwbG90KHBweWVfeXBmX3Rhc2FzKQ0KYGBgDQoNCg0KYGBge3J9DQojYcOxb3MgYmFzZXMNCmFuaW9fYmFzZV95cGZfc2VnbWVudG8gPC0gICBwcHllX3lwZiRhY3Rpdm9fdXBzdHJlYW1bcHB5ZV95cGYkYW5pbyA9PSAyMDA2XQ0KDQphbmlvX2Jhc2VfeXBmX2JvbHNhciA8LSBwcHllX3lwZiRwcHllX2ludGVncmFkYVtwcHllX3lwZiRhbmlvID09IDIwMDZdDQoNCg0Kc3RvY2tfeV9wb3pvc195cGYgPC0gIHBweWVfeXBmICU+JSANCiAgbXV0YXRlKGluZGljZV9wb3pvc18wNiA9IGdlbmVyYXJfaW5kaWNlKHNlcmllPSBwb3pvcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDA2KSkgJT4lIA0KICBtdXRhdGUocHB5ZV95cGZfZXN0aW1hZG8gPSBhbmlvX2Jhc2VfeXBmX2JvbHNhciAqIGluZGljZV9wb3pvc18wNiwNCiAgICAgICAgIGFjdGl2b195cGZfZXN0aW1hZG8gPWFuaW9fYmFzZV95cGZfc2VnbWVudG8gKiBpbmRpY2VfcG96b3NfMDYsDQogICAgICAgICB1bmlkYWRfcHB5ZT0iTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpDQoNCnN0b2NrX3lfcG96b3NfeXBmICU+JQ0KICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkID0gdW5pZGFkX3BweWUsIHBweWVfeXBmX2VzdGltYWRvLCBhY3Rpdm9feXBmX2VzdGltYWRvKSAlPiUNCiAgICAgICAgICAgZ2F0aGVyKGtleSA9IGVzdGltYWNpb24sDQogICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWxvciwgDQogICAgICAgICAgICAgICAgICAgMzo0KSAlPiUgDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSBkZSBZUEYgYSBwYXJ0aXIgZGUgaW5kaWNlIGRlIHBvem9zIikNCmBgYA0KDQojIyMjIyMgUFB5RSB5IGFjdGl2byB1cHN0cmVhbSB0b3RhbCByYW1hIGEgcGFydGlyIGRlIFlQRg0KDQpgYGB7cn0NCnBvem9zX3lmcF9zb2JyZV90b3RhbCA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9IGFuaW9fdGVybWluYWNpb25fcG96bykgJT4lIA0KICBncm91cF9ieShhbmlvKSAlPiUgDQogIHN1bW1hcmlzZShwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkgJT4lIA0KICBsZWZ0X2pvaW4obGlzdGFkb19wb3pvcyAlPiUNCiAgICAgICAgICAgICAgcmVuYW1lKGFuaW8gPSBhbmlvX3Rlcm1pbmFjaW9uX3Bvem8pICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGlkZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhbmlvLCBpZGVtcHJlc2EpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHBvem9zX2NhcmdhZG9zX3lwZiA9IHN1bShwb3pvcywgbmEucm0gPSBUKSkpICU+JSANCiAgbXV0YXRlKHlwZl9zb2JyZV90b3RhbCA9IHBvem9zX2NhcmdhZG9zX3lwZi9wb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSkNCiMgcG96b3NfeWZwX3NvYnJlX3RvdGFsDQoNCmVzdGltYWNpb25fcHB5ZV90b3RhbF92aWFfeXBmIDwtIHN0b2NrX3lfcG96b3NfeXBmICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCA9IHVuaWRhZF9wcHllLCBwcHllX3lwZl9lc3RpbWFkbywgYWN0aXZvX3lwZl9lc3RpbWFkbykgJT4lIA0KICBnYXRoZXIoa2V5ID0gZXN0aW1hY2lvbiwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsIA0KICAgICAgICAgMzo0KSAlPiUgDQogIGxlZnRfam9pbihwb3pvc195ZnBfc29icmVfdG90YWwgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgeXBmX3NvYnJlX3RvdGFsKSkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvci95cGZfc29icmVfdG90YWwsDQogICAgICAgICAgZXN0aW1hY2lvbiA9IGNhc2Vfd2hlbihlc3RpbWFjaW9uID09ICJwcHllX3lwZl9lc3RpbWFkbyIgfiAicHB5ZV9lc3RpbWFkb190b3RhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWFjaW9uID09ICJhY3Rpdm9feXBmX2VzdGltYWRvIiB+ICJhY3Rpdm9fZXN0aW1hZG9fdXBzdHJlYW0iICkpDQogIA0KZXN0aW1hY2lvbl9wcHllX3RvdGFsX3ZpYV95cGYgJT4lDQogICAgICAgICAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbyx2YWxvciAsIGNvbG9yID0gZXN0aW1hY2lvbikpKw0KICBnZW9tX2xpbmUoKSsNCiAgbGFicyh5PSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHRpdGxlID0gIkVzdGltYWNpb24gZGUgQWN0aXZvIHVzcHRyZWFtIHkgUFB5RSB0b3RhbCBhIHBhcnRpciBkZSBhbXBsaWFjacOzbiBkZSBwb3pvcyBZUEYiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQojIyBJbnZlcnNpb25lcw0KDQpGdWVudGVzOiANCg0KKiBCYWxhbmNlcyBkZSBCb2xzYXIuIEludmVyc2nDs24gY2FsY3VsYWRhIGEgcGFydGlyIGRlIHZhcmlhY2lvbmVzIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIGNhcGl0YWwgZmlqbyAoZXN0byDDumx0aW1vIGVzdMOhIHBlbmRpZW50ZSkNCiogU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYS4gUmVzb2x1Y2nDs24gMjA1NyANCiAgKyBbSW52ZXJzaW9uZXMgcmVhbGl6YWRhcyBhw7FvIGFudGVyaW9yXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtL2FyY2hpdm8vMjg1ZDQ1ZTUtMWI4OC00ZGFlLThlNWMtYzAxODQzYzdjOGMwKQ0KICArIFtJbnZlcnNpb25lcyBhbnVhbGVzIHByZXZpc3RhcyBhIHJlYWxpemFyIGVuIGVsIGHDsW8gZGUgbGEgcHJlc2VudGFjacOzbiBkZSBsYSBEREpKXShodHRwOi8vZGF0b3MubWluZW0uZ29iLmFyL2RhdGFzZXQvaW52ZXJzaW9uZXMtZW4tbWVyY2Fkby1kZS1oaWRyb2NhcmJ1cm9zLXVwc3RyZWFtKQ0KDQoNCjQpIGNvbnN0cnVpciBzZXJpZSBkZSBpbnZlcnNpw7NuIHBhcmEgYXRyYXMgKGJ1c2NhciBTdG9jayBkZSBZUEYgcGVybyBzb2xvIHBhcmEgZXh0cmFjY2nDs24pLiBhcm1hciBlamVyY2ljaW8gZGUgRkQgeSB2ZXIgc2kgbGFzIHByb3BvcmNpb25lcyBzZSBtYW50aWVuZW4uIA0KDQoqIFJlY29uc3RydWNjaW9uIGRlIHNlcmllIGRlIGludmVyc2lvbiBwb3IgZW1wcmVzYQ0KdmVyIHVuIGZsdWpvIGRlIHBvem9zIHkgdW4gZmx1am8gZGUgaW52ZXJzaW9uIHkgbHVlZ28gdmVyIHNpIGxvIHF1ZSBtdWV2ZSBsYSBpbnZlcnNpb24gc29uIGxvcyBwb3pvcyAocXVlIHN1IGV2b2x1Y2lvbiBzZWEgc2ltaWxhcikuIA0KDQotIGludmVyc2lvbiBwb3IgZW1wcmVzYSAoYmFsYW5jZTogdmFyaWFjaW9uIGRlbCBhY3Rpdm8gKyBjb25zdW1vIGRlIEsgZmlqbykNCi0gaW52ZXJzaW9uIHBvciBlbXByZXNhIChzZWNyZXRhcmlhIGRlIGVuZXJnaWEpDQotIGludmVyc2lvbiBhZ3JlZ2FkYSAodGlwbyBkZSBpbnZlcnNpb24pIChjdWVudGFzIG5hY2lvbmFsZXM/KQ0KLSBwb3pvcyBudWV2b3MgcG9yIGVtcHJlc2EgcG9yIGHDsW8NCi0gcG96b3MgbnVldm9zIHRvdGFsZXMNCi0gYXBsaWNhciBNSVAgcGFyYSBZUEYgDQoNCkludmVyc2nDs24gYSBwYXJ0aXIgZGUgQmFsYW5jZXMNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmludmVyc2lvbmVzX2VtcHJlc2EgPC0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMgJT4lDQogIHVuZ3JvdXAoKSAlPiUgDQogIHNlbGVjdCgtYyhmdWVudGUsIHNlY3RvcikpICU+JSANCiAgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllIikgJT4lDQogIGFycmFuZ2UoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBncm91cF9ieSh1bmlkYWQsIHZhcmlhYmxlLCBlbXByZXNhKSAlPiUNCiAgbXV0YXRlKHZhbG9yID0gdmFyaWFjaW9uX2ludGVyYW51YWwodmFsb3IpKQ0KICAgDQojIGludmVyc2lvbmVzX2VtcHJlc2ENCg0KZ3JhZl9pbnZlcnNpb25lc19lbXByZXNhIDwtIGludmVyc2lvbmVzX2VtcHJlc2EgJT4lIA0KICBmaWx0ZXIoZW1wcmVzYSAhPSAiQ2FtdXp6aSBHYXMgUGFtcGVhbmEiKSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gZW1wcmVzYSkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBwb3IgZW1wcmVzYSIsDQogICAgICAgc3VidGl0bGUgPSAiQSBwYXJ0aXIgZGUgYmFsYW5jZXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiLA0KICAgICAgIGNhcHRpb24gPSAiQmFsYW5jZXMgZGUgZW1wcmVzYXMgZXh0cmHDrWRvcyBkZSBCb2xzYXIiKSsNCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUpDQojIGdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfZW1wcmVzYSwgd2lkdGggPSA4MDAsIGhlaWdodCA9IDYwMCkNCg0KYGBgDQoNCg0KSW52ZXJzacOzbiBhIHBhcnRpciBkZSBTZWNyZXRhcmlhIGRlIEVuZXJnw61hDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvciA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtYW8tYW50ZXJpb3IuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhgRmVjaGEgRmluIFRhcmVhc2AgPSBjb2xfZGF0ZShmb3JtYXQgPSAiJWQvJW0vJVkiKSwgDQogICAgICAgIGBGZWNoYSBJbmljaW8gVGFyZWFzYCA9IGNvbF9kYXRlKGZvcm1hdCA9ICIlZC8lbS8lWSIpKSkgJT4lIA0KICByZW5hbWUoYW5pbyA9ICJBw7FvIGRlIHByZXNlbnRhY2nDs24gZGUgbGEgRERKSiIsDQogICAgICAgICBlbXByZXNhID0gIkVtcHJlc2EgaW5mb3JtYW50ZSIsDQogICAgICAgICBjb25jZXB0byA9ICJEZXNjcmlwY2nDs24gZGVsIHBsYW4gZGUgYWNjacOzbiAoQ29uY2VwdG9zKSIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbiA9ICJDYW50LiBFeHBsb3JhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3RhY2lvbiA9ICJDYW50LiBFeHBsb3RhY2lvbiIsDQogICAgICAgICBjYW50aWRhZF9leHBsb3JhY2lvbl9jb21wbGVtZW50YXJpYSA9ICJDYW50LiBFeHBsb3JhY2lvbiBDb21wbGVtZW50YXJpYSIsDQogICAgICAgICBleHBsb3JhY2lvbl9taWxsb25lc191c2QgPSAiTWlsbG9uZXMgdSRzIEV4cGxvcmFjaW9uIiwNCiAgICAgICAgIGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCA9ICJNaWxsb25lcyB1JHMgRXhwbG90YWNpb24iLA0KICAgICAgICAgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkID0gIk1pbGxvbmVzIHUkcyBFeHAuIENvbXBsZW1lbnRhcmlhIikgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFuaW8gLSAxLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgc2VsZWN0KGFuaW8sIGVtcHJlc2EsIGlkZW1wcmVzYSwgIGNvbmNlcHRvLA0KICAgICAgICAgY2FudGlkYWRfZXhwbG9yYWNpb24sIGNhbnRpZGFkX2V4cGxvdGFjaW9uLGNhbnRpZGFkX2V4cGxvcmFjaW9uX2NvbXBsZW1lbnRhcmlhLA0KICAgICAgICAgZXhwbG9yYWNpb25fbWlsbG9uZXNfdXNkLGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgZXhwbG9yYWNpb25fY29tcGxfbWlsbG9uZXNfdXNkICkgJT4lIA0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbykgJT4lIA0KICBzdW1tYXJpc2UoaW52ZXJzaW9uX2V4cGxvdGFjaW9uID0gc3VtKGV4cGxvdGFjaW9uX21pbGxvbmVzX3VzZCwgbmEucm0gPSBUKSkgJT4lIA0KICBhcnJhbmdlKC1pbnZlcnNpb25fZXhwbG90YWNpb24pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiKQ0KaW52ZXJzaW9uZXNfYW5pb19hbnRlcmlvcg0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnJlc29sdWNpbl8yMDU3X2ludmVyc2lvbmVzX3JlYWxpemFkYXNfbWVuc3VhbCA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9JbnZlcnNpb24vU2VjcmV0YXJpYSBkZSBFbmVyZ2lhL3Jlc29sdWNpbi0yMDU3LWludmVyc2lvbmVzLXJlYWxpemFkYXMtbWVuc3VhbC5jc3YiKQ0KDQpyZXNvbHVjaW5fMjA1N19pbnZlcnNpb25lc19maW5fY29uY2VzaW9uPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvSW52ZXJzaW9uL1NlY3JldGFyaWEgZGUgRW5lcmdpYS9yZXNvbHVjaW4tMjA1Ny1pbnZlcnNpb25lcy1yZWFsaXphZGFzLWZpbi1kZS1jb25jZXNpbi5jc3YiKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmludmVyc2lvbmVzXzIwMDVfMjAxMiA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0ludmVyc2lvbi9TZWNyZXRhcmlhIGRlIEVuZXJnaWEvdGFibGFzIGRpbmFtaWNhcy9pbnZlcnNpb25lc18yMDA1XzIwMTIueGxzeCIsIA0KICAgIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiLCAidGV4dCIsICJ0ZXh0IiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIpLCANCiAgICBza2lwID0gOCkgJT4lIA0KICByZW5hbWUocGxhbl8xcmFfc2VtYW5hID0gIlBsYW4gMcKqIFNlbS4iLA0KICAgICAgICAgcGxhbl9hbnVhbCA9ICJQbGFuIEFudWFsIiwNCiAgICAgICAgIHJlYWxpemFkb19hbnVhbCA9ICJSZWFsaXphZG8gQW51YWwiLA0KICAgICAgICAgY29uY2VwdG8gPSBDb25jZXB0bykgJT4lIA0KICBtdXRhdGUoYW5pbyA9ICB6b286Om5hLmxvY2YoYW5pbyksDQogICAgICAgICBlbXByZXNhID0gIHpvbzo6bmEubG9jZihlbXByZXNhKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgICAgZW1wcmVzYSA9Y2FzZV93aGVuKGVtcHJlc2EgPT0gIllQRiBTLkEuIiB+ICJZUEYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgKFNVQ1VSU0FMIEFSR0VOVElOQSkgTExDIiB+ICJQQUUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBBTiBBTUVSSUNBTiBFTkVSR1kgU0wiIH4gIlBBRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUEVUUk9CUkFTIEFSR0VOVElOQSBTLkEuIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlBFU0EgKFBFVFJPQlJBUyBFLlMuQS4pIiB+ICJQZXRyb2JyYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIkVOQVAgU0lQRVRST0wgQVJHRU5USU5BIFMuQS4iIH4gIkVOQVAgU0lQRVRST0wiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlZJU1RBIE9JTCAmIEdBUyBBUkdFTlRJTkEgU0FVIiB+ICJWaXN0YSBPaWwgYW5kIEdhcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVklTVEEgT0lMICYgR0FTIEFSR0VOVElOQSBTQSIgfiAiVmlzdGEgT2lsIGFuZCBHYXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHJlc2EgPT0gIlNJTk9QRUMgQVJHRU5USU5BIEVYUExPUkFUSU9OIEFORCBQUk9EVUNUSU9OLCBJTkMuIiB+ICJTaW5vcGVjIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJURUNQRVRST0wgUy5BLiIgfiAiVGVjcGV0cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiUExVU1BFVFJPTCBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJQTFVTUEVUUk9MIEVORVJHWSBTLkEuIiB+ICJQbHVzcGV0cm9sIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJDT01QQcORw41BIEdFTkVSQUwgREUgQ09NQlVTVElCTEVTIFMuQS4iIH4gIkNHQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiV0lOVEVSU0hBTEwgRU5FUkdJQSBTLkEuIiB+ICJXaW50ZXJzaGFsbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiWVNVUiBFTkVSR8ONQSBBUkdFTlRJTkEgUy5SLkwuIiB+ICJZU1VSIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXByZXNhID09ICJZU1VSIFBFVFJPTEVSQSBBUkdFTlRJTkEgUy5BLiIgfiAiWVNVUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1wcmVzYSA9PSAiVE9UQUwgQVVTVFJBTCBTLkEuIiB+ICJUb3RhbCBBdXN0cmFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZW1wcmVzYSkpICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoIk8mRyBERVZFTE9QTUVOVFMgTFREIFMuQS4iICwiUEVUUk9NSU5FUkEgQ0hVQlVUIFMuRS4iKSkpICU+JQ0KICAjIGZpbHRlcihzdHJfZGV0ZWN0KGNvbmNlcHRvLCAncG96bycpKSAlPiUNCiAgZ3JvdXBfYnkoZW1wcmVzYSwgYW5pbywgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShpbnZlcnNpb25fYW51YWwgPSBzdW0ocmVhbGl6YWRvX2FudWFsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGFycmFuZ2UoLWludmVyc2lvbl9hbnVhbCkNCmludmVyc2lvbmVzXzIwMDVfMjAxMg0KDQoNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyIDwtICBpbnZlcnNpb25lc18yMDA1XzIwMTIgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2FudWFsLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKHRhYmxhcyBkaW5hbWljYXMpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJFeHRyYcOtZG8gZGUgdGFibGFzIGRpbsOhbWljYXMiLA0KICAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgY2FwdGlvbiA9ICJTZWNyZXRhcmlhIGRlIEVuZXJnw61hIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uZXNfMjAwNV8yMDEyLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKQ0KDQpncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgPC0gIGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogIGdncGxvdChhZXMoYW5pbywgaW52ZXJzaW9uX2V4cGxvdGFjaW9uLCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgcG9yIGVtcHJlc2EgKGHDsW8gYW50ZXJpb3IpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIiwNCiAgICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiLA0KICAgICAgIGNhcHRpb24gPSAiU2VjcmV0YXJpYSBkZSBFbmVyZ8OtYSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpnZ3Bsb3RseShncmFmX2ludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IsIHdpZHRoID0gNzAwLCBoZWlnaHQgPSA0NTApDQoNCmBgYA0KDQoNCiMjIyBBbsOhbGlzaXMgZGUgY29ycmVsYWNpw7NuIGVudHJlIEludmVyc2nDs24geSBQb3pvcw0KDQotIGJ1c2NhciBjb3JyZWxhY2lvbiwgcGFyYSB2ZXIgc2kgbGEgc2VyaWUgZGUgaW52ZXJzacOzbiBzZSBtdWV2ZSBzaW1pbGFyIGEgbG9zIHBvem9zDQotIHVzYXIgc3RvY2sgeSBhZGVtYXMgdXNhciB2YXJpYWNpb24gZGUgc3RvY2sgKGJzIGRlIHVzbykNCg0KQ29uIHBvem9zIGRlIElBUEcNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvcyA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzX2FuaW9fYW50ZXJpb3IgJT4lDQogICAgICAgICAgICAgIHVuZ3JvdXAoKSwgYnkgPSBjKCJlbXByZXNhIiwgImFuaW8iKSkgJT4lIA0KICBtdXRhdGUoaW52ZXJzaW9uX3Bvcl9wb3pvID0gaW52ZXJzaW9uX2V4cGxvdGFjaW9uIC90b3RhbF9wb3pvcykNCg0KI2NvbiBpbnZlcnNpb25lcyBhbnVuY2lhZGFzDQppbnZlcnNpb25fcG96b3NfMiA8LSBwb3pvc19pYXBnICU+JSANCiAgbGVmdF9qb2luKGludmVyc2lvbmVzXzIwMDVfMjAxMiAlPiUNCiAgICAgICAgICAgICAgdW5ncm91cCgpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQogIG11dGF0ZShpbnZlcnNpb25fcG9yX3Bvem8gPSBpbnZlcnNpb25fYW51YWwgL3RvdGFsX3Bvem9zKQ0KDQojZXN0YSBtYWwgcHEgZXMgZmx1am8gZGUgcG96b3MgdnMgc3RvY2sgZGUgY2FwaXRhbA0KIyBrdGFfcG96b3MgPC0gcG96b3NfaWFwZyAlPiUgDQojICAgbGVmdF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KIyAgICAgICAgICAgICAgIHVuZ3JvdXAoKSAlPiUgDQojICAgICAgICAgICAgICAgc2VsZWN0KC1zZWN0b3IpLCBieSA9IGMoImVtcHJlc2EiLCAiYW5pbyIpKSAlPiUgDQojICAgbXV0YXRlKHBweWVfcG9yX3Bvem8gPSBwcm9wX3BsYW50X2VxdWlwIC90b3RhbF9wb3pvcykNCg0KDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl9pbnZlcnNpb25fcG96byA8LSBpbnZlcnNpb25fcG96b3MgJT4lIA0KICBmaWx0ZXIoIGFuaW8gPj0gMjAxMikgJT4lDQogIGdncGxvdChhZXMoYW5pbyxpbnZlcnNpb25fcG9yX3Bvem8sIGNvbG9yID0gZW1wcmVzYSApKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJJbnZlcnNpb25lcyBhw7FvIGFudGVyaW9yIHNvYnJlIHBvem9zIElBUEciLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkNCmdncGxvdGx5KGdyYWZfaW52ZXJzaW9uX3Bvem8sIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem9fMiA8LSBpbnZlcnNpb25fcG96b3NfMiAlPiUgDQogIGZpbHRlciggYW5pbyA8PSAyMDEyKSAlPiUNCiAgZ2dwbG90KGFlcyhhbmlvLGludmVyc2lvbl9wb3JfcG96bywgY29sb3IgPSBlbXByZXNhICkpKw0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICBsYWJzKHRpdGxlID0gIkludmVyc2lvbmVzIHJlYWxpemFkYXMgc29icmUgcG96b3MgSUFQRyIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96b18yLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCkNvbiBwb3pvcyBDYXAgSVYNCmBgYHtyIGVjaG89RkFMU0V9DQojIGNvbiBpbnZlcnNpb25lcyByZWFsaXphZGFzIGHDsW8gYW50ZXJpb3INCmludmVyc2lvbl9wb3pvc19jYXBpdiA8LSBsaXN0YWRvX3Bvem9zICU+JQ0KICByZW5hbWUoYW5pbyA9YW5pb190ZXJtaW5hY2lvbl9wb3pvKSAlPiUgDQogIGxlZnRfam9pbihpbnZlcnNpb25lc19hbmlvX2FudGVyaW9yICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCksIGJ5ID0gYygiZW1wcmVzYSIsICJhbmlvIiApKSAlPiUNCiAgbXV0YXRlKGludmVyc2lvbl9wb3JfcG96byA9IGludmVyc2lvbl9leHBsb3RhY2lvbiAvcG96b3MpDQoNCmdyYWZfaW52ZXJzaW9uX3Bvem8gPC0gaW52ZXJzaW9uX3Bvem9zX2NhcGl2ICU+JSANCiAgZmlsdGVyKCBhbmlvID49IDIwMTIpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8saW52ZXJzaW9uX3Bvcl9wb3pvLCBjb2xvciA9IGVtcHJlc2EgKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIGxhYnModGl0bGUgPSAiSW52ZXJzaW9uZXMgYcOxbyBhbnRlcmlvciBzb2JyZSBwb3pvcyBDYXBpdHVsbyBJViIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgVVNEIikrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KZ2dwbG90bHkoZ3JhZl9pbnZlcnNpb25fcG96bywgd2lkdGggPSA3MDAsIGhlaWdodCA9IDQwMCkNCg0KDQpgYGANCg0KIyMgUmVnYWzDrWFzDQoNCiogRnVlbnRlczogDQogICsgU2VjcmV0YXLDrWEgZGUgRW5lcmfDrWEgKEJhc2UgUmVnYWzDrWFzKQ0KDQoNClJFVklTQVIgRUwgQ0FMQ1VMTyBERSBCRVRBTklBIA0KY3VhbnRvIGdhbmFyaWFuIGxhcyBwcm92aW5jaWFzIHNpIGVsIHByZWNpbyBkZWwgbWVyY2FkbyBpbnRlcm5vIHNlIGFjb21vZGEgYWwgaW50ZXJuYWNpb25hbD8NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiNyZWdhbGlhcw0KI2ZpbHRybyBjb24gcHJvZHVjdG9zDQpwcm9kdWN0b3MgPC0gbGlzdCgiY3J1ZG8iLCAiZ2FzIiwgImdhc29saW5hIiwgImdscCIpDQoNCiNsb29wIHBhcmEgbGV2YW50YXIgbGFzIGJhc2VzDQpsaXN0YV9yZWdhbGlhcyA9IGxpc3QoKQ0KZm9yKGkgaW4gcHJvZHVjdG9zKXsNCiAgcmVnYWxpYXNfaSA8LSByZWFkX2RlbGltKHBhc3RlMCgiQzovQXJjaGl2b3MvRGF0b3MvSGlkcm9jYXJidXJvcy9Fc3RpbWFjaW9uIHByb3BpYS9kYXRhc2V0cy9yZWdhbGlhc18iLCBpLCAiLmNzdiIpLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUsIA0KICAgIHNraXAgPSAxKQ0KICBsaXN0YV9yZWdhbGlhc1tbaV1dIDwtIHJlZ2FsaWFzX2kNCn0NCg0KI2Jhc2VzIGluZGl2aWR1YWxlcw0KcmVnYWxpYXNfY3J1ZG8gPC0gbGlzdGFfcmVnYWxpYXMkY3J1ZG8gJT4lIA0KICBtdXRhdGUobW9uZWRhID0gIlVTRCIsDQogICAgICAgICBwcm9kdWN0byA9ICJjcnVkbyIpDQpyZWdhbGlhc19nYXMgPC0gbGlzdGFfcmVnYWxpYXMkZ2FzICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJhcnMiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2FzIikNCnJlZ2FsaWFzX2dhc29saW5hIDwtIGxpc3RhX3JlZ2FsaWFzJGdhc29saW5hICU+JSANCiAgbXV0YXRlKG1vbmVkYSA9ICJVU0QiLA0KICAgICAgICAgcHJvZHVjdG8gPSAiZ2Fzb2xpbmEiKQ0KcmVnYWxpYXNfZ2xwIDwtIGxpc3RhX3JlZ2FsaWFzJGdscCAlPiUgDQogIG11dGF0ZShtb25lZGEgPSAiYXJzIiwNCiAgICAgICAgIHByb2R1Y3RvID0gImdscCIpDQoNCiNiYXNlIGNvbXBsZXRhDQpyZWdhbGlhcyA8LSAgcmVnYWxpYXNfY3J1ZG8gJT4lIA0KICBiaW5kX3Jvd3MocmVnYWxpYXNfZ2FzLCByZWdhbGlhc19nYXNvbGluYSwgcmVnYWxpYXNfZ2xwKSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDkU8iLA0KICAgICAgICAgbWVzID0gIk1FUyIsIA0KICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSAiVE9UQUwgUFJPVklOQ0lBIikgJT4lIA0KICBtdXRhdGUoZmVjaGEgPSBhcy5EYXRlKHBhcnNlX2RhdGVfdGltZShwYXN0ZTAoYW5pbywgbWVzKSwgb3JkZXJzID0gInltIikpKSAlPiUgDQogIHNlbGVjdChmZWNoYSwgYW5pbywgbWVzLCBwcm9kdWN0bywgbW9uZWRhLCByZWdhbGlhc190b3RhbCwgZXZlcnl0aGluZyguKSkgJT4lIA0KICBncm91cF9ieShwcm9kdWN0bywgYW5pbywgbW9uZWRhICkgJT4lIA0KICBzdW1tYXJpc2UocmVnYWxpYXNfdG90YWwgPSBzdW0ocmVnYWxpYXNfdG90YWwpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgJT4lIA0KICBtdXRhdGUocmVnYWxpYXNfdG90YWwgPSBjYXNlX3doZW4obW9uZWRhID09ICJVU0QiIH4gcmVnYWxpYXNfdG90YWwgKiBUQ0MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gcmVnYWxpYXNfdG90YWwpLA0KICAgICAgICAgdW5pZGFkID0gImFycyIpICU+JSANCiAgc2VsZWN0KC1jKFRDQywgbW9uZWRhKSkNCg0KcmVnYWxpYXMNCg0KcmVnYWxpYXNfdXNkIDwtIHJlZ2FsaWFzICU+JSANCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoYW5pbywgdGNjKSkgJT4lIA0KICBtdXRhdGUocmVnYWxpYXMgPSByZWdhbGlhc190b3RhbCAvdGNjLCANCiAgICAgICAgIHVuaWRhZCA9ICJVU0QiKSAlPiUgDQogIHNlbGVjdCgtYyhyZWdhbGlhc190b3RhbCwgdGNjKSkNCg0KYGBgDQoNCiMjIFN1YnNpZGlvcw0KYGBge3J9DQojIENFRklQIGNvbnQgZXQgYWwuIFN1YnNpZGlvcyBjb21vICUgZGVsIFBCSQ0Kc3Vic2lkaW9zX2NlZmlwIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL3N1YnNpZGlvcy9zdWJzaWRpb3MueGxzeCIpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sDQogICAgICAgICB2YWx1ZSA9IHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSwNCiAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yICVpbiUgYygiQ0FNTUVTQSIsICJQbGFuIEdhcyIsIkVOQVJTQSIsICJTdWJzaWRpb3MgRkYgR04geSBHTFAiKSkgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkgJT4lIA0KICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcGJpKSkgJT4lDQogIG11dGF0ZShzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmk9YXMuZG91YmxlKHN1YnNpZGlvc19wb3JjZW50YWplX3BiaSksDQogICAgICAgICBzdWJzaWRpb3NfY2VmaXAgPSBzdWJzaWRpb3NfcG9yY2VudGFqZV9wYmkgKiBwYmkgKiAxMF42KSAlPiUgDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgICAgIHN1YnNpZGlvc19jZWZpcD1zdW0oc3Vic2lkaW9zX2NlZmlwLCBuYS5ybSA9IFQpKQ0KDQojZWplcyANCnN1YnNpZGlvc19lamVzIDwtIHJlYWRfZXhjZWwoIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL3N1YnNpZGlvcy54bHN4IiApICU+JSANCiAgcmVuYW1lKHN1YnNpZGlvc191c2QgPSBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcykgJT4lIA0KICByaWdodF9qb2luKHRjcF9hbnVhbF9iICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB0Y2MpLCBieSA9ICJhbmlvIikgJT4lDQogIGdyb3VwX2J5KGFuaW8pICU+JSANCiAgc3VtbWFyaXNlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIHN1YnNpZGlvc19lamVzID0gc3Vic2lkaW9zX3VzZCp0Y2MqMTBeNikNCg0Kc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MgPC0gc3Vic2lkaW9zX2VqZXMlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHN1YnNpZGlvc19lamVzKSAlPiUgDQogIGZ1bGxfam9pbihzdWJzaWRpb3NfY2VmaXAsIGJ5ID1jKCJhbmlvIiwgInVuaWRhZCIpKSAlPiUgDQogIGFycmFuZ2UoLWFuaW8pICU+JSANCiAgbXV0YXRlKHVuaWRhZCA9ICJQZXNvcyBjb3JyaWVudGVzIikNCiAgICAgICAgICMgeCA9IHN1YnNpZGlvc19jZWZpcC9zdWJzaWRpb3NfZWplcykNCnN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICANCmBgYA0KDQoNCg0KIyBWYWxvciB0b3RhbCBkZSBsYSBwcm9kdWNjacOzbiAgDQoNCg0KIyMgQ3JpdGVyaW9zIG1ldG9kb2zDs2dpY29zIA0KU2UgcHJlc2VudGFuIGEgY29udGludWFjacOzbiBkaXN0aW50YXMgZXN0aW1hY2lvbmVzIHNvYnJlIGxhIG1hZ25pdHVkIGRlIHJpcXVlemEgcHJlc2VudGUgZW4gZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvOiBWYWxvciBCcnV0byB5IEFncmVnYWRvIGRlIFByb2R1Y2Npw7NuIChWQlAgeSBWQSksIENvbnN1bW8gSW50ZXJlbWVkaW8gKENJKSwgTWFzYSBTYWxhcmlhbCAoTVMpIHkgRXhjZWRlbnRlIEJydXRvIGRlIEV4cGxvdGFjacOzbiAoRUJFKS4gRWwgVkJQIHN1cmdlIGRlIGxhIHZhbHVhY2nDs24gZGUgbGEgcHJvZHVjY2nDs24gYSBzdXMgcHJlY2lvcyBjb3JyZXNwb25kaWVudGVzLiBFbCBWQSByZXN1bHRhIGRlIGxhIGRpZmVyZW5jaWEgZW50cmUgZWwgVkJQIHkgQ0ksIGVsIGN1YWwgcHVlZGUgc3VyZ2lyIG9yaWdpbmFsbWVudGUgZGUgZXN0YSByZXN0YSBvIGEgcGFydGlyIGRlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyBkZSBsYSBNYXRyaXogSW5zdW1vIFByb2R1Y3RvIChNSVApLiBFbCBFQkUgY29uc3RpdHV5ZSBsYSBwbHVzdmFsw61hIChQVikgdG90YWwgZGUgbGEgcmFtYSwgZXMgZGVjaXIsIGxhIHN1bWEgZGUgbGEgcmVudGEgZGUgbGEgdGllcnJhIChSVCkgbcOhcyBsYSBnYW5hbmNpYSBub3JtYWwgKEdub3JtKSwgeSBzZSBvYnRpZW5lIGx1ZWdvIGRlIGRlc2NvbnRhciBsYSBNUyB5IGxvcyBpbXB1ZXN0b3MgZXNwZWPDrWZpY29zIChJbXApIGRlbCBWQS4gRW4gdG9kb3MgbG9zIGNhc29zIHF1ZSBzZSBwcmVzZW50YXLDoW4gYSBjb250aW51YWNpw7NuLCBsb3MgSW1wIHNlIGNhbGN1bGFyb24gYSBwYXJ0aXIgZGUgYXBsaWNhciBzb2JyZSBlbCBWQlAgdW4gY29lZmljaWVudGUgIHJlc3VsdGFudGUgZGVsIHBlc28gZGUgbG9zIGltcHVlc3RvcyBwcm9tZWRpbyBkZSBsYSAgTUlQIGRlIDE5OTcuIExvIG1pc21vIHBhc2EgY29uIGxhIGVzdGltYWNpw7NuIGRlIGxhIGRlcHJlY2lhY2nDs24gZGUgY2FwaXRhbCBvIGNvbnN1bW8gZGUgY2FwaXRhbCBmaWpvIChDb25zS2Zpam8pLCBxdWUgc2Ugb2J0aWVuZSBhIHBhcnRpciBkZSBhcGxpY2FyIGxhIHRhc2EgZGUgZGVwcmVjaWFjacOzbiBwcm9tZWRpbyByZXN1bHRhbnRlIGRlIGxvcyBiYWxhbmNlcyBkZSBZUEYgKDE5OTggLSAyMDE4KSBzb2JyZSBlbCB0b3RhbCBkZSBQcm9waWVkYWQsIFBsYW50YSB5IEVxdWlwbyAoUFB5RSkgZGUgbGEgcmFtYS4gRXN0YSBwYXJ0aWRhIHNlIGFwbGljYSBwYXJhIG9idGVuZXIgZWwgRXhjZWRlbnRlIE5ldG8gZGUgRXhwbG90YWNpw7NuLiBTZSBwcmVzZW50YW4gZGlzdGludGFzIGVzdGltYWNpb25lcyBwYXJhIGVsIFZCUCwgQ0kgeSBNUywgcXVlIGx1ZWdvIHNlIG9ic2VydmFyw6FuIGVuIGxhIGZvcm11bGFjacOzbiBtYXRlbcOhdGljYToNCg0KDQoNCiogQ0NOTiAoKmNjbm5fb2ZpY2lhbCopDQogICsgVmFsb3JlcyBjb250YWJsZXMgb2ZpY2lhbGVzIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMgKHPDs2xvIGRpc3BvbmlibGUgcGFyYSBlbCBwZXLDrW9kbyAyMDA0LTIwMTIpLiBEYWRvIHF1ZSBzZSBwcmVzZW50YW4gc2VyaWVzIGRlIFZCUCB5IFZBLCBzZSBwdWRvIGVzdGltYXIgZWwgQ0kgY29tbyBsYSBkaWZlcmVuY2lhIGRlIGRpY2hhcyBjdWVudGFzLiBTZSBwcm9jZWRpw7MgYSBzZXBhcmFyIGVsIFZCUCBhIHBhcnRpciBkZWwgcGVzbyBkZWwgVkJQIGRlIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gYSBsYSBleHRyYWNjacOzbiBzb2JyZSBlbCBWQlAgZGUgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzLCBwcmVzZW50ZSBlbiBlbCBDdWFkcm8gZGUgVXRpbGl6YWNpw7NuIGRlIE9mZXJ0YSAoQ09VKSBkZSAyMDA0IGRlIElOREVDLiBTZSBkZXNjb250w7MgZXN0YSBwcm9wb3JjacOzbiAocmVzdWx0YW50ZSBkZWwgMTAsNyUpIGRlbCBWQlAgdG90YWwgcGFyYSBvYnRlbmVyIHVuIFZCUCBzw7NsbyBkZSBleHRyYWNjacOzbi4gRGFkbyBxdWUgc2UgcG9zZWUgaW5mb3JtYWNpw7NuIGRlbCBzYWxhcmlvIHByb21lZGlvIGRlbCBzZWN0b3IgeSBlbCBlbXBsZW8sIHNlIHB1ZG8gb2J0ZW5lciBsYSBNUyByZXN1bHRhbnRlLCB0YW50byBwYXJhIGVsIHRvdGFsIGRlbCBzZWN0b3IgKGV4dHJhY2Npw7NuIHkgc2VydmljaW9zIHJlbGFjaW9uYWRvcykgY29tbyBwYXJhIHPDs2xvIGV4dHJhY2Npw7NuLiBBIHBhcnRpciBkZSBlc3RvcyBkYXRvcyBzZSBlbGFib3LDsyB1biBjb2VmaWNpZW50ZSBxdWUgcmVmbGVqYSBlbCBwcm9tZWRpbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBsYSBNUyBzb2JyZSBlbCBWQlAgcXVlIHNlIHV0aWxpemFyw6EgZW4gY8OhbGN1bG9zIHBvc3RlcmlvcmVzIGRlIE1TIHRvdGFsIHkgTVMgZGUgZXh0cmFjY2nDs24uIA0KDQoqIEVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gQ0NOTiAoKnZicF92YV9jaV9wcm9waWEqKQ0KICArIEVzdGltYWNpw7NuIHByb3BpYSBkZSBsb3MgdmFsb3JlcyBjb250YWJsZXMgYSBwYXJ0aXIgZGUgbGFzIGZ1ZW50ZXMgcmVjb3BpbGFkYXMsIHNpZ3VpZW5kbyBsb3MgY3JpdGVyaW9zIGRlIGxhcyBDdWVudGFzIE5hY2lvbmFsZXMuIEVzIGRlY2lyLCBwYXJhIG9idGVuZXIgZWwgVkJQIHNlIHZhbHVhIGxhIHByb2R1Y2Npw7NuIGRlc3RpbmFkYSBhbCBtZXJjYWRvIGludGVybm8gKHJlc3VsdGFudGUgYSBwYXJ0aXIgZGUgbGEgZGlmZXJlbmNpYSBlbnRyZSBwcm9kdWNjacOzbiB5IGV4cG9ydGFjaW9uZXMpIGNvbiBsb3MgcHJlY2lvcyBpbnRlcm5vcyB5IGxhcyBleHBvcnRhY2lvbmVzIGNvbiBsb3MgcHJlY2lvcyBkZSBleHBvcnRhY2nDs24sIHZhbHVhZG9zIHRpcG8gZGUgY2FtYmlvIGNvbWVyY2lhbCAoVENDKS4gU2UgcHJvY2VkacOzIHRhbWJpw6luIGEgc2VwYXJhciBlbCBWQlAgZGUgZXh0cmFjY2nDs24gbmV0byBkZSBsb3Mgc2VydmljaW9zIHRhbCBjb21vIHNlIGV4cGxpY8OzIGFudGVyaW9ybWVudGUuIEVsIENJIHNlIGVzdGltw7MgYSBwYXJ0aXIgZGUgYXBsaWNhciBlbCBjb2VmaWNpZW50ZSB0w6ljbmljbyAocmF0aW8gQ0kvVkJQKSByZXN1bHRhbnRlIGRlIGxhIE1JUCBkZSAxOTk3IChlcXVpdmFsZW50ZSBhIDAuMjcyKS4gRGUgaWd1YWwgbWFuZXJhLCBwYXJhIGNhbGN1bGFyIGxhIG1hc2Egc2FsYXJpYWwgc2UgYXBsaWPDsyBlbCBjb2VmaWNpZW50ZSBkZSBNUyBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUuIEZpbmFsbWVudGUsIGNvbW8gc2UgbWVuY2lvbsOzIGFudGVyaW9ybWVudGUsIGVsIFZBIGVsIEVCRSBzZSBjYWxjdWxhcm9uIGEgcGFydGlyIGRlIGxhcyBkaWZlcmVuY2lhcyBtZW5jaW9uYWRhcyBhbnRlcmlvcm1lbnRlLiANCg0KKiBFbXBhbG1lIENDTk4gKCp2YnBfY2NubiopDQogICsgRXN0aW1hY2nDs24gcXVlIHRvbWEgbG9zIHZhbG9yZXMgb2ZpY2lhbGVzIGRlIGxhcyBjdWVudGFzIG5hY2lvbmFsZXMgcGFyYSBlbCBwZXLDrW9kbyBkb25kZSBzZSBwcmVzZW50YW4gZGF0b3MgKDIwMDQgLTIwMTIpIHkgcXVlIGltcHV0YSBsb3MgdmFsb3JlcyBmYWx0YW50ZXMgcG9yIG1lZGlvIGRlIGxhIGV2b2x1Y2nDs24gZGVsIMOtbmRpY2UgZGVsIFZCUCBwcm9waW8gY29uIGNyaXRlcmlvIENDTk4gZXhwbGljYWRvIGFudGVyaW9ybWVudGUuIEFzaW1pc21vLCBzZSB1dGlsaXphcm9uIGxvcyB2YWxvcmVzIG9maWNpYWxlcyBkZSBsYSBNUyBjdWFuZG8gc2UgZW5jb250cmFiYSBkaXNwb25pYmxlIGVsIGRhdG8gKDE5OTYtMjAxOCksIG1pZW50cmFzIHF1ZSBzZSB1dGlsaXrDsyBlbCB2YWxvciBwcm9waW8gZXN0aW1hZG8gY29uIGNyaXRlcmlvIGRlIGxhcyBDQ05OIHBhcmEgbG9zIHJlc3RhbnRlcyBhw7Fvcy4gDQogIA0KKiBDcml0ZXJpbyBQcm9waW8gKCpwdl9oaWRyb2NhcmJ1cm9zX3Byb3BpYSopDQogICsgRXN0aW1hY2nDs24gcHJvcGlhIHF1ZSByZWZsZWphIGNvbiBtYXlvciBwcmVjaXNpw7NuIGVsIHZhbG9yIGRlIGxhIHJpcXVlemEgdG90YWwgcHJlc2VudGUgZW4gZWwgc2VjdG9yLiBFbCBWQlAgc2Ugb2J0aWVuZSBhIHBhcml0ciBkZSB2YWx1YXIgbGEgdG90YWxpZGFkIGRlIGxhIHByb2R1Y2Npw7NuIGEgbG9zIHByZWNpb3MgZXh0ZXJub3MgbyBkZSByZWZlcmVuY2lhIGludGVybmFjaW9uYWwgeSBjb24gZWwgdGlwbyBkZSBjYW1iaW8gZGUgcGFyaWRhZCAoVENQKSwgcXVlIG1pZGUgbGEgY2FwYWNpZGFkIHJlYWwgZGUgY29tcHJhIGRlIGxhIG1vbmVkYSBuYWNpb25hbC4gU2luIGVtYmFyZ28sIGNvbW8gZWwgQ0kgY29uc3RpdHV5ZSBpbnRlcmNhbWJpb3MgZGUgbWVyY2FuY8OtYXMgcmVhbGl6YWRhcyBlbiBlbCDDoW1iaXRvIG5hY2lvbmFsLCBkaWNoYSBwYXJ0aWRhIHNlIG9idGllbmUgYSBwYXJ0aXIgZGUgbG9zIHZhbG9yZXMgb2J0ZW5pZG9zIGVuIGxhIHNlcmllIGRlIGVtcGFsbWUgQ0NOTi4gRGUgaWd1YWwgbWFuZXJhLCBzZSB1dGlsaXrDsyBsYSBNUyByZXN1bHRhbnRlIGRlIGVzdGEgw7psdGltYSBlc3RpbWFjacOzbi4gDQoNCg0KDQoNCiMjIEZvcm11bGFjacOzbiBtYXRlbcOhdGljYSBkZSBlc3RpbWFjaW9uZXMNCg0KVmFsb3IgQnJ1dG8gZGUgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkVkJQX3twcm9waWF9ID0gKFBleHRfe3BldHLDs2xlb30gKiBRX3twZXRyw7NsZW99ICsgUGV4dF97Z2FzfSAqIFFfe2dhc30pICogVENQJCQNCg0KRG9uZGU6IA0KDQoqICRWQlBfe3Byb3BpYX0kID0gVmFsb3IgQnJ1dG8gZGUgbGEgUHJvZHVjY2nDs24gdG90YWwsIGVzdGltYWNpw7NuIHByb3BpYQ0KKiAkUGV4dF97cGV0csOzbGVvfSQgPSBQcmVjaW8gZGUgZXhwb3J0YWNpw7NuIG8gcmVmZXJlbmNpYSBpbnRlcm5hY2lvbmFsIGRlbCBwZXRyw7NsZW8gY3J1ZG8gKHNlZ8O6biBjb3JyZXNwb25kYSkNCiogJFBleHRfe2dhc30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbiBvIHJlZmVyZW5jaWEgaW50ZXJuYWNpb25hbCBkZWwgZ2FzIG5hdHVyYWwgKHNlZ8O6biBjb3JyZXNwb25kYSkNCiogJFFfe3BldHLDs2xlb30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIHRvdGFsZXMgZGUgcGV0csOzbGVvIGNydWRvDQoqICRRX3tnYXN9JCA9IENhbnRpZGFkZXMgcHJvZHVjaWRhcyB0b3RhbGVzIGRlIGdhcyBuYXR1cmFsDQoqICRUQ1AkID0gVGlwbyBkZSBDYW1iaW8gZGUgUGFyaWRhZA0KDQoNClZhbG9yIEJydXRvIGRlIFByb2R1Y2Npw7NuIHRvdGFsLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRWQlBfe0NDTk59ID0gKFBpbnRfe3BldHLDs2xlb30gKiBRTUludF97cGV0csOzbGVvfSArIFBleHRfe3BldHLDs2xlb30gKiBFeHBvX3twZXRyw7NsZW99ICsgUGludF97Z2FzfSAqIFFNSW50X3tnYXN9ICsgUGV4dF97Z2FzfSAqIEV4cG9fe2dhc30pKiBUQ0MkJA0KDQpEb25kZToNCg0KKiAkVkJQX3tDQ05OfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiB0b3RhbCwgIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJFBpbnRfe3BldHLDs2xlb30kID0gUHJlY2lvIG1lcmNhZG8gaW50ZXJubyBkZWwgcGV0csOzbGVvIGNydWRvDQoqICRQaW50X3tnYXN9JCA9IFByZWNpbyBtZXJjYWRvIGludGVybm8gZGVsIGdhcyBuYXR1cmFsDQoqICRRTUludF97cGV0csOzbGVvfSQgPSBjYW50aWRhZGVzIHZlbmRpZGFzIGFsIG1lcmNhZG8gaW50ZXJubyBkZSBwZXRyw7NsZW8gY3J1ZG8NCiogJFFNSW50X3tnYXN9JCA9IGNhbnRpZGFkZXMgdmVuZGlkYXMgYWwgbWVyY2FkbyBpbnRlcm5vIGRlbCBnYXMgbmF0dXJhbA0KKiAkRXhwb197cGV0csOzbGVvfSQgPSBleHBvcnRhY2lvbmVzIGRlIHBldHLDs2xlbyBjcnVkbw0KKiAkRXhwb197Z2FzfSQgPSBleHBvcnRhY2lvbmVzIGRlIGdhcyBuYXR1cmFsDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCg0KPGJyPg0KDQpWYWxvciBCcnV0byBkZSBQcm9kdWNjacOzbiBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCg0KJCRWQlBcX2V4dHJfe0NDTk59ID0gVkJQX3tDQ05OfSAqICgxLXByb3BcX3NlcnZpY2lvcykkJA0KDQpEb25kZToNCg0KKiAkVkJQXF9leHRyX3tDQ05OfSQgPSBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiBleHRyYWNjacOzbiwgIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gZGUgbGFzIENDTk4NCiogJHByb3BcX2V4dHIkID0gcHJvcG9yY2nDs24gZGVsIFZCUCBkZSBzZXJ2aWNpb3MgZGUgYXBveW8gc29icmUgVkJQIGRlIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcw0KDQoNClByb3BvcmNpw7NuIGRlIGxvcyBzZXJ2aWNpb3MgZGUgYXBveW8gc29icmUgbGEgZXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIHkgZ2FzDQo8YnI+DQokJHByb3BcX3NlcnZpY2lvcyA9IFxmcmFje1ZCUFxfc2VydmljaW9zX3tDT1V9fXtWQlBcX2V4dHJfe0NPVX0gKyBWQlBcX3NlcnZpY2lvc197Q09VfX0kJA0KDQpEb25kZToNCg0KKiAkVkJQXF9zZXJ2aWNpb3Nfe0NPVX0kID0gVkJQIGRlIHNlcnZpY2lvcyBkZSBhcG95byBkZWwgQ3VhZHJvIGRlIFV0aWxpemFjacOzbiBkZSBPZmVydGENCiogJFZCUFxfZXh0cmFjY2nDs25fe0NPVX0kID0gVkJQIGRlIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcyBkZWwgQ3VhZHJvIGRlIFV0aWxpemFjacOzbiBkZSBPZmVydGENCg0KDQoNCjxicj4NCkNvbnN1bW8gSW50ZXJtZWRpbywgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGFzIENDTk4NCiQkIENJX3tDQ05OfSA9IFZCUF97Q0NOTn0gLSAgVkFfe0NDTk59ICQkDQoNCkRvbmRlOg0KDQoqICRDSV97Q0NOTn0kID0gQ29uc3VtbyBJbnRlcm1lZGlvIHRvdGFsLCBlc3RpbWFjacOzbiBwcm9waWENCiogJFZBX3tDQ05OfSQgPSBWYWxvciBBZ3JlZ2FkbywgZXN0aW1hY2nDs24gZGUgbGFzIENDTk4gDQoNCjxicj4NCkNvbnN1bW8gSW50ZXJtZWRpbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkIENJX3tDQ05OfSA9IFZCUF97Q0NOTn0gKiAgQ29lZlxfdGVjICQkDQpEb25kZToNCg0KKiAkQ29lZlxfdGVjJCA9IENvZWZpY2llbnRlIHTDqWNuaWNvIGRlIE1hdHJpeiBJbnN1bW8gUHJvZHVjdG8NCg0KPGJyPg0KQ29uc3VtbyBJbnRlcm1lZGlvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KDQokJCBDSVxfZXh0cl97Q0NOTn0gPSBWQlBcX2V4dHJfe0NDTk59ICogIENvZWZcX3RlYyAkJA0KDQpEb25kZToNCg0KKiAkIENJXF9leHRyX3tDQ05OfSQgPSBDb25zdW1vIEludGVybWVkaW8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNyaXRlcmlvIENDTk4NCg0KPGJyPg0KTWFzYSBTYWxhcmlhbCwgdmFsb3JlcyBvZmljaWFsZXMgZGUgbGFzIENDTk4NCiQkTVMgPSBXICogRW1wICogMTMkJA0KRG9uZGU6IA0KDQoqICRNUyQgPSBNYXNhIFNhbGFyaWFsIA0KKiAkVyQgPSAgU2FsYXJpbyBhbnVhbCBwcm9tZWRpbw0KKiAkRW1wJCA9IEVtcGxlbw0KDQo8YnI+DQpNYXNhIFNhbGFyaWFsLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRNUyA9ICBWQlBfe0NDTk59ICogIENvZWZcX01TJCQNCg0KRG9uZGU6IA0KDQoqICRDb2VmXF9NUyQgPSBDb2VmaWNpZW50ZSBkZSBsYSBwcm9wb3JjacOzbiBkZSBNUyBzb2JyZSBWQlANCg0KPGJyPg0KTWFzYSBTYWxhcmlhbCBkZSBleHRyYWNjacOzbiwgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIENDTk4NCiQkTVNcX2V4dHIgPSAgVkJQXF9leHRyX3tDQ05OfSAqICBDb2VmXF9NUyQkDQoNCkRvbmRlOiANCg0KICAqICRNU1xfZXh0ciQgPSBNYXNhIHNhbGFyaWFsIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24NCg0KPGJyPg0KVmFsb3IgYWdyZWdhZG8sIGVzdGltYWNpw7NuIGNyaXRlcmlvIENDTk4NCiQkVkFfe0NDTk59ICA9IFZCUF97Q0NOTn0g4oCTIENJX3tDQ05OfSAkJA0KRG9uZGU6DQoNCiogJFZBX3tDQ05OfSQgPSBWYWxvciBBZ3JlZ2FkbywgZXN0aW1hY2nDs24gcHJvcGlhIGNvbiBjcml0ZXJpbyBDQ05ODQoNCjxicj4NClZhbG9yIGFncmVnYWRvIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRWQVxfZXh0cl97Q0NOTn0gID0gVkJQXF9leHRyX3tDQ05OfSDigJMgQ0lcX2V4dHJfe0NDTk59ICQkDQoNCkRvbmRlOg0KDQoqICRWQVxfZXh0cl97Q0NOTn0kID0gVmFsb3IgQWdyZWdhZG8gZGUgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIHByb3BpYSBjb24gY3JpdGVyaW8gQ0NOTiANCg0KDQo8YnI+DQpWYWxvciBhZ3JlZ2FkbywgZXN0aW1hY2nDs24gY29uIGNyaXRlcmlvIHByb3Bpbw0KJCRWQV97cHJvcGlhfSAgPSBWQlBfe3Byb3BpYX0g4oCTIENJXF9leHRyX3tDQ05OfSAkJA0KDQpEb25kZToNCg0KKiAkVkFfe3Byb3BpYX0kID0gVmFsb3IgQWdyZWdhZG8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8gDQoNCg0KPGJyPg0KDQpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRFQkVfe0NDTk59ICA9IFZBX3tDQ05OfSDigJMgTVMgICAkJA0KPGJyPg0KDQpFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuIGRlIGV4dHJhY2Npw7NuLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gQ0NOTg0KJCRFQkVcX2V4dHJfe0NDTk59ICA9IFZBXF9leHRyX3tDQ05OfSDigJMgTVNcX2V4dHIgICAkJA0KDQo8YnI+DQoNCkV4Y2VkZW50ZSBCcnV0byBkZSBFeHBsb3RhY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkRUJFX3twcm9waWF9ICA9IFZBX3twcm9waWF9IOKAkyBNU1xfZXh0ciAgICQkDQoNCg0KRG9uZGU6DQoNCiogJEVCRSQgPSBFeGNlZGVudGUgQnJ1dG8gZGUgRXhwbG90YWNpw7NuDQoqICRDSVxfZXh0cl97Q0NOTn0kID0gQ29uc3VtbyBpbnRlcm1lZGlvIGRlbCBzZWN0b3IgZXh0cmFjY2nDs24sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBDQ05ODQoNCg0KPGJyPg0KQ29uc3VtbyBkZSBDYXBpdGFsIEZpam8sIGVzdGltYWNpw7NuIGNvbiBjcml0ZXJpbyBwcm9waW8NCiQkQ29uS2Zpam8gPSBQUHlFICogIHByb20oXGZyYWN7RGVwfXtQUHlFfSkgJCQNCg0KRG9uZGU6IA0KDQoqICRDb25LZmlqbyQgPSBDb25zdW1vIGRlIENhcGl0YWwgRmlqbw0KKiAkUFB5RSQ9IFByb3BpZWRhZCwgUGxhbnRhIHkgRXF1aXBvIG5ldGENCiogJHByb20oXGZyYWN7RGVwfXtQUHlFfSkgJCA9ICB0YXNhIGRlIGRlcHJlY2lhY2nDs24gcHJvbWVkaW8NCiogJERlcCQgPSBEZXByZWNpYWNpb25lcyAoY3VlbnRhIGdhc3RvcyBwb3IgbmF0dXJhbGV6YSkNCg0KPGJyPg0KDQpQbHVzdmFsw61hIChFeGNlZGVudGUgTmV0byBkZSBFeHBsb3RhY2nDs24pLCBlc3RpbWFjacOzbiBjb24gY3JpdGVyaW8gcHJvcGlvDQokJFBWX3twcm9waWF9ID0gVkFfe3Byb3BpYX0gLSBDb25LZmlqbyAtIEltcCAkJA0KDQoNCkRvbmRlOg0KDQoqICRQVl97cHJvcGlhfSQgPSBQbHVzdmFsw61hICgqRXhjZWRlbnRlIE5ldG8gZGUgRXhwbG90YWNpw7NuKikNCiogJEltcCQgPSBJbXB1ZXN0b3Mgbm9ybWFsZXMNCg0KDQoNCiMjIEZ1ZW50ZXMgcGFyYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHNlcmllcyANCg0KKiBQcm9kdWNjacOzbiBkZSBDcnVkbzogDQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgLSBhY3R1YWxpZGFkOiBTRVNDTyBEb3duc3RyZWFtDQogIA0KKiBFeHBvcnRhY2lvbmVzIGRlIENydWRvOiANCiAgKyAxOTYyIGEgMTk5MzogVU4gQ29tdHJhZGUgKGNsYXNpZmljYWNpw7NuIFNJVEMgYXMgcmVwb3J0ZWQpDQogICsgMTk5NCBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIExvcyBkYXRvcyBmYWx0YW50ZXMgZGUgU0VTQ08gc2UgY29tcGxldGFyb24gY29uIE1FQ09ODQogICsgU2lndWVuIGhhYmllbmRvIGRhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTY1LCAxOTcwLTc0LCAxOTc2LTc4LCAxOTgwLTg0DQogIA0KKiBQcmVjaW8gTWVyY2FkbyBJbnRlcm5vIGRlIENydWRvOiANCiAgKyAxOTYzIGEgMTk2NTogS296dWxqIHkgUGlzdG9uZXNpIC0gUmV2aXN0YSBJREVFIGFqdXN0YWRvIGNvbiBlbCDDrW5kaWNlIGRlbCBwcmVjaW8gZGVsIEFudWFyaW8gZGUgWVBGIA0KICArIDE5ODkgYSAxOTkxOiBBbnVhcmlvIGRlIFlQRg0KICArIDE5NjYgYSAxOTg4OiBLb3p1bGogeSBQaXN0b25lc2kgLSBSZXZpc3RhIElERUUNCiAgKyAxOTkyOiBNRUNPTiBhanVzdGFkbyBjb24gbGEgdmFyaWFjacOzbiBkZWwgw41uZGljZSBkZSBwcmVjaW9zIGludGVybm9zIGFsIHBvciBtYXlvciAoSVBJTSkNCiAgKyAxOTkzIGVuIGFkZWxhbnRlOiBNRUNPTiANCiAgDQoqIFByZWNpbyBNZXJjYWRvIEV4dGVybm8gQ3J1ZG86DQogICsgZW50cmUgMTk2MiB5IDE5OTI6IHByZWNpbyBkZSBleHBvcnRhY2nDs24gYXJnZW50aW5hIGRlIFVOIENvbXRyYWRlDQogICsgZW50cmUgMTk5My0yMDAxIHkgMjAwNC0yMDE0OiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBNZWNvbg0KICArIGVudHJlIDIwMDIgeSAyMDAzOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGRlIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZSAoQ2xhc2lmaWNhY2nDs24gSFMgYXMgcmVwb3J0ZWQpICANCiAgKyAyMDE0IGVuIGFkZWxhbnRlOiBwcmVjaW8gZGUgZXhwb3J0YWNpw7NuIGFyZ2VudGluYSBkZSBTZWNyZXRhcsOtYSBkZSBFbmVyZ8OtYSAoUmVnYWzDrWFzKQ0KICArIFZhbG9yZXMgZmFsdGFudGVzIHByZXZpb3MgYSAxOTkyOiBCcmVudCAgKEZ1ZW50ZTogSW5mbGF0aW9uIERhdGEpDQogIA0KKiBQcm9kdWNjacOzbiBkZSBHYXM6DQogICsgMTkxMSBhIDE5OTI6IEFudWFyaW8gZGUgY29tYnVzdGlibGVzIA0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNFU0NPIERvd25zdHJlYW0NCiAgDQoqIEV4cG9ydGFjaW9uZXMgZGUgZ2FzOiANCiAgKyAxOTYyIGEgMTk5NjogVU4gQ29tdHJhZGUsDQogICsgMTk5NyBlbiBhZGVsYW50ZTogU0VTQ08gRG93bnN0cmVhbQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyAxOTk5IHkgMjAwMA0KICANCiogUHJlY2lvIE1lcmNhZG8gSW50ZXJubyBkZSBnYXM6DQogICsgMTk2MyAtIDE5NjkgJiAxOTg5IC0gMTk5MjogQW51YXJpbyBkZSBZUEYNCiAgKyAxOTcwIC0gMTk4ODogIEtvenVsaiB5IFBpc3RvbmVzaSAtIFJldmlzdGEgSURFRQ0KICArIDE5OTMgZW4gYWRlbGFudGU6IFNlY3JldGFyw61hIGRlIEVuZXJnw61hIC0gQmFzZSBSZWdhbMOtYXMNCiAgKyBFbCBkYXRvIGRlbCBhw7FvIDE5OTIgc2UgZGl2aWRpw7MgcG9yIDEwLCBkYWRvIHF1ZSByZXN1bHRhYmEgZXhjZXNpdmFtZW50ZSBhbHRvLCBsbyBjdWFsIGVzIG1ldG9kb2zDs2dpY2FtZW50ZSBpbmFjZXB0YWJsZSBwZXJvIHNpcnZlIGRlIGVqZXJjaWNpby4gDQogIA0KKiBQcmVjaW8gTWVyY2FkbyBFeHRlcm5vOg0KICArIEHDsW9zIDE5NjQgeSAxOTY1OiBQcmVjaW8gZGUgaW1wb3J0YWNpw7NuIGRlIGdhcyBwcm92ZW5pZW50ZSBkZSBCb2xpdmlhIGhhY2lhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIDE5NjYgZW4gYWRlbGFudGU6IFByZWNpbyBkZSBleHBvcnRhY2lvbiBkZSBnYXMgZGVzZGUgQm9saXZpYSBhIEFyZ2VudGluYSBkZSBVTiBDb210cmFkZQ0KICArIERhdG9zIGZhbHRhbnRlcyBwYXJhIGxvcyBhw7FvcyBwcmV2aW9zIGEgMTk2MyB5IHBlcsOtb2RvIDE5NjgtMTk3MSANCg0KKiBWYWxvciBCcnV0byBkZSBsYSBQcm9kdWNjacOzbiwgVmFsb3IgQWdyZWdhZG8geSBDb25zdW1vIEludGVybWVkaW86DQogICsgSU5ERUMgLSBEaXJlY2Npw7NuIE5hY2lvbmFsIGRlIEN1ZW50YXMgTmFjaW9uYWxlcyAoQmFzZSBNaW5lcsOtYSBlIEhpZHJvY2FyYnVyb3MgZGUgbGFzIEN1ZW50YXMgTmFjaW9uYWxlcykuIExhcyB2YXJpYWJsZXMgImV4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyIgcmVmaWVyZW4gYSAiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIGNydWRvIHkgZ2FzIG5hdHVyYWwuIEFjdGl2aWRhZGVzIGRlIHNlcnZpY2lvcyByZWxhY2lvbmFkYXMgY29uIGxhIGV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyB5IGdhcywgZXhjZXB0byBsYXMgYWN0aXZpZGFkZXMgZGUgcHJvc3BlY2Npw7NuIg0KICArIEPDoWxjdWxvIHByb3BpbyBkZWwgVkJQIGNvbiBkYXRvcyBkYXRvcyBkZSBwcm9kdWNjacOzbiB5IHByZWNpbyBpbnRlcm5hY2lvbmFsIHJlY29waWxhZG9zLiBMYXMgZnVlbnRlcyBzb24gbGFzIHNpZ3VpZW50ZXMgKGxvcyBjcml0ZXJpb3Mgc29uIGxvcyBtaXNtb3MgcGFyYSBsYSB1dGlsaXphY2nDs24gcG9zdGVyaW9yIGVuIGVsIGPDoWxjdWxvIGRlIHJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcywgc29icmV2YWx1YWNpw7NuIGNhbWJpYXJpYSB5IG90cm9zIG1lY2FuaXNtb3MpDQoNCiogU2FsYXJpbyB5IGVtcGxlbw0KICArIDE5NjAtMTk5NjogZXN0aW1hY2nDs24gYSBwYXJ0aXIgZGUgYXBsaWNhY2nDs24gZGVsIGNvZWZpY2llbnRlIGRlIHByb3BvcmNpw7NuIGRlIGxhIG1hc2Egc2FsYXJpYWwgc29icmUgZWwgVkJQDQogICsgMTk5NiBlbiBhZGVsYW50ZTogTWluaXN0ZXJpbyBkZSBUcmFiYWpvLCBFbXBsZW8geSBTZWd1cmlkYWQgU29jaWFsIC0gT2JzZXJ2YXRvcmlvIGRlIEVtcGxlbyB5IERpbsOhbWljYSBFbXByZXNhcmlhbCAoT0VERSkNCg0KKiBDb25zdW1vIGRlIGNhcGl0YWwgZmlqbw0KICArIENvZWZpY2llbnRlIGRlIGRlcHJlY2lhY2nDs24gZXN0aW1hZG8gYSBwYXJ0aXIgZGUgRXN0YWRvcyBDb250YWJsZXMgZGUgWVBGICgxOTk4LTIwMTgpDQo8YnI+DQoNCg0KDQojIyMgQ3VlbnRhcyBOYWNpb25hbGVzDQoNCltQcm9kdWN0byBJbnRlcm5vIEJydXRvIEV4cGxvdGFjacOzbiBNaW5hcyB5IENhbnRlcmFzIE1pbGxvbmVzIGRlIHBlc29zIGNvbnN0YW50ZXMuIEJhc2UgMTk2MC4gVmFsb3JlcyB0cmltZXN0cmFsZXMNClBJQiBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBlbiBtaWxsb25lcyBkZSBwZXNvcyBkZSAxOTYwLiAxOTcwLTE5ODBdKGh0dHBzOi8vZGF0b3MuZ29iLmFyL2RhdGFzZXQvc3NwbS1wcm9kdWN0by1pbnRlcm5vLWJydXRvLXNlY3RvcmlhbC0xOTcwLTE5ODApDQoNCg0KW1Byb2R1Y3RvIEludGVybm8gQnJ1dG8gRXhwbG90YWNpw7NuIE1pbmFzIHkgQ2FudGVyYXMsIEF1c3RyYWxlcyBjb25zdGFudGVzLiBCYXNlIDE5NzAuVmFsb3JlcyB0cmltZXN0cmFsZXMNClBJQiBFeHBsb3RhY2nDs24gTWluYXMgeSBDYW50ZXJhcyBlbiBhdXN0cmFsZXMgYSBwcmVjaW9zIGRlIDE5NzAuIDE5ODAtMTk5MF0oaHR0cHM6Ly9kYXRvcy5nb2IuYXIvZGF0YXNldC9zc3BtLXByb2R1Y3RvLWludGVybm8tYnJ1dG8tc2VjdG9yaWFsLTE5ODAtMTk5MCkgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojTUlQIDk3DQojIGNvZWZpY2llbnRlcyBkZSByZXF1ZXJpbWllbnRvcyBkaXJlY3Rvcw0KDQptaXBfOTcgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvRGF0b3MvTUlQL21pcF9tYXRyaXoxMi54bHMiLCANCiAgICBza2lwID0gNykgJT4lIA0KICBzZWxlY3QoLSIuLi4xIikgJT4lIA0KICByZW5hbWUoYWN0aXZpZGFkID0gIi4uLjIiKQ0KICAjIGZpbHRlcigiLi4uMiIgJWluJSBjKCAiVXNvcyBkZSBsYSBwcm9kdWNjacOzbiBuYWNpb25hbCBhIHByZWNpb3MgYsOhc2ljb3MiLCAgIlZhbG9yIGJydXRvIGRlIGxhIHByb2R1Y2Npw7NuIGEgcHJlY2lvcyBiw6FzaWNvcyIgKSkNCg0KY2lfZXh0cmFjY2lvbiA8LSBtaXBfOTdbYygxMjYsMTQ5KSwgYygiYWN0aXZpZGFkIiAsICJFeHRyYWNjacOzbiBkZSBwZXRyw7NsZW8sIGdhcywgY2FyYsOzbiB5IHVyYW5pbyIpXQ0KDQpjb2VmX3RlY25pY29fOTcgPC0gY2lfZXh0cmFjY2lvblsxLDJdL2NpX2V4dHJhY2Npb25bMiwyXQ0KDQp4IDwtIG1pcF85N1tjKDE0MCwgMTQ5KSxdICMlPiUgDQogICAjIGdhdGhlcihrZXkgPSBzZWN0b3IsIHZhbHVlID0gdmFsb3IsIDI6bmNvbCguKSkgJT4lIA0KDQppbXBfcHJvbV85NyA8LSBhcHBseShYID0geFsxLDI6bmNvbCh4KV0veFsyLDI6bmNvbCh4KV0gLCBNQVJHSU4gPSAxICwgRlVOID0gZnVuY3Rpb24oeCkgbWVhbih4LCBuYS5ybT1UKSAgKQ0KICAgIA0KDQojIGNvZWYgQ1VPIDIwMDQgYSBwYXJ0aXIgZGUgQ0kvVkJQDQojIGNvZWZfdGVjbmljbyA8LSAgMC4zNjkxMDQzMDINCg0KDQojUGVzbyBkZSBsb3Mgc2VydmljaW9zDQojQ1VPIA0KI2xhIHN1bWEgZGUgbGFzIGNvbHVtbmFzIG5vcyBkYSBlbCBWQlANCkNPVSA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9NSVAvc2hfY291XzA2XzE2LnhscyIsIA0KICAgIHNraXAgPSAyKSAlPiUNCiAgcmVuYW1lKHByb2R1Y3RvID0gIi4uLjEiLA0KICAgICAgICAgY3BjID0gIi4uLjIiKSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RvLCAiXFxkIikgJiAhKHN0cl9kZXRlY3QocHJvZHVjdG8sICJeTiIpKSkgJT4lDQogIGdyb3VwX2J5KHByb2R1Y3RvKSAlPiUgDQogIG11dGF0ZV9hbGwoYXMuZG91YmxlKQ0KDQpzZXJ2aWNpb19zX2V4dHJhY2Npb24gPC0gIHN1bShDT1VbMTJdKS8oIHN1bShDT1VbMTFdKSArIHN1bShDT1VbMTJdKSApDQpucm93KENPVSkNCg0KDQojIERlcHJlY2lhY2nDs24gZGVsIHN0b2NrDQpjb25zdW1vX2tfZmlqb195cGYgPC0gKHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvYmFsYW5jZXNfYXJnLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgJT4lDQogIGZpbHRlcihlbXByZXNhID09ICJZUEYiKSAlPiUgDQogIGdyb3VwX2J5KGVtcHJlc2EpICU+JSANCiAgbXV0YXRlKHRhc2FfZGVwcmVjaWFjaW9uID0gZGVwcmVjaWFjaW9uZXMvcHB5ZSkgJT4lIA0KICBzdW1tYXJpc2UodGFzYV9kZXByZWNpYWNpb24gPSBtZWFuKGRlcHJlY2lhY2lvbmVzL3BweWUpKSkkdGFzYV9kZXByZWNpYWNpb24NCg0KdmFyKChyZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpICU+JQ0KICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICBncm91cF9ieShmZWNoYSkgJT4lDQogIHN1bW1hcmlzZSh0YXNhX2RlcHJlY2lhY2lvbiA9IG1lYW4oZGVwcmVjaWFjaW9uZXMvcHB5ZSkpKSR0YXNhX2RlcHJlY2lhY2lvbikNCg0KDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI0NDTk4gKGRhdG9zIG9maWNpYWxlcykNCiMjIEJhc2UgbWluZXLDrWENCmNjbm5fb2ZpY2lhbCA8LSByZWFkX2V4Y2VsKCJDOi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL01lY29uL2Jhc2UtbWluZXJpYS1lLWhpZHJvY2FyYnVyb3MgY3VlbnRhcyBuYWNpb25hbGVzLnhscyIsIHNoZWV0ID0gIkN1ZW50YXMgTmFjaW9uYWxlcyIsIHNraXAgPSA1KSAlPiUgDQogIHJlbmFtZShhbmlvID0gIkHDsW8iLA0KICAgICAgICAgcGVyaW9kbyA9IlBlcsOtb2RvIiwNCiAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uNSIsDQogICAgICAgIHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyA9ICAiLi4uMTUiKSAlPiUgDQogIGZpbHRlcihpcy5uYShwZXJpb2RvKSwgIWlzLm5hKGFuaW8pICkgJT4lICAjZmlsdHJhbW9zIGxvcyBkYXRvcyBhbnVhbGVzDQogIG11dGF0ZSh1bmlkYWQgPSAiTWlsZXMgZGUgcGVzb3MgY29ycmllbnRlcyIsDQogICAgICAgICB2YnBfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zPSBhcy5kb3VibGUodmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyksDQogICAgICAgICB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9IGFzLmRvdWJsZSh2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyA9IHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICB2YV9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MgPSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MgKiAoMSAtIHNlcnZpY2lvX3NfZXh0cmFjY2lvbiksDQogICAgICAgICBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3M9DQogICAgICAgICAgIHZicF9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MtdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zID0gdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAtIHZhX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcykgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl95X3NlcnZpY2lvc19oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmJwX2V4dHJhY2Npb25faGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zKSAlPiUgDQogIGdyb3VwX2J5KGFuaW8sIHVuaWRhZCkgJT4lDQogIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3gvMTBeM30pICU+JQ0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIGxlZnRfam9pbihtYXNhX3NhbGFyaWFsX2hpZHJvY2FyYnVyb3MgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHVuaWRhZCwNCiAgICAgICAgICAgICAgICAgICAgIG1zX3RvdCA9IG1hc2Ffc2FsYXJpYWxfdG90YWxfb2VkZSwNCiAgICAgICAgICAgICAgICAgICAgIG1zX2V4dHIgPW1hc2Ffc2FsYXJpYWxfZXh0cmFjY2lvbl9vZWRlICksIGJ5ID0gYygiYW5pbyIsICJ1bmlkYWQiKSkgJT4lIA0KICBtdXRhdGUoZWJlX3RvdCA9IHZhX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyID0gdmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zIC1tc19leHRyLA0KICAgICAgICAgZnVlbnRlID0gIkNDTk4gb2ZpY2lhbCIgKSAlPiUgDQogIHJlbmFtZSh2YnBfZXh0ciA9IHZicF9leHRyYWNjaW9uX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV9leHRyID0gY2lfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmFfZXh0ciA9dmFfZXh0cmFjY2lvbl9oaWRyb2NhcmJ1cm9zLA0KICAgICAgICAgdmJwX3RvdD0gdmJwX2V4dHJhY2Npb25feV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcyAsIA0KICAgICAgICAgdmFfdG90PSB2YV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MsDQogICAgICAgICBjaV90b3QgPSBjaV9leHRyYWNjaW9uX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MpICU+JSANCiAgdW5ncm91cCgpDQpjY25uX29maWNpYWwNCg0KbWVhbl9jb2VmX21zIDwtICBjY25uX29maWNpYWwgJT4lIA0KICBzdW1tYXJpc2UoY29lZl9tc190b3QgPSBtZWFuKG1zX3RvdC92YnBfdG90LG5hLnJtPSBUKSwNCiAgICAgICAgICAgICAgY29lZl9tc19leHRyPSBtZWFuKG1zX2V4dHIvdmJwX2V4dHIgLG5hLnJtPSBUKSkNCg0KbWVkaWFuX2NvZWZfbXMgPC0gIGNjbm5fb2ZpY2lhbCAlPiUgDQogIHN1bW1hcmlzZShjb2VmX21zX3RvdCA9IG1lZGlhbihtc190b3QvdmJwX3RvdCxuYS5ybT0gVCksDQogICAgICAgICAgICAgIGNvZWZfbXNfZXh0cj0gbWVkaWFuKG1zX2V4dHIvdmJwX2V4dHIgLG5hLnJtPSBUKSkNCg0KIyAjIGVzdGltYWNpb24gcHJvcGlhIGNvZWYgdGVjbmljbw0KIyBjY25uX29maWNpYWwgJT4lIA0KIyAgIHN1bW1hcmlzZShjb2VmX3JlcV9leHRyX3lfc2VydiA9bWVhbihjaV9leHRyX3lfc2VydmljaW9zX2hpZHJvY2FyYnVyb3MvdmJwX2V4dHJfeV9zZXJ2aWNpb3NfaGlkcm9jYXJidXJvcywgbmEucm09VCksDQojICAgICAgICAgIGNvZWZfcmVxX2V4dHIgPSBtZWFuKGNpX2V4dHJfaGlkcm9jYXJidXJvcy92YnBfZXh0cl9oaWRyb2NhcmJ1cm9zLCBuYS5ybT1UKSkNCg0KDQojIEJhc2UgSU5ERUMNCnggPC0gcmVhZF9leGNlbCgiLi4vZGF0YS9pbmRlYy9zaF9WQlBfVkFCXzAzXzIxLnhscyIsIHNoZWV0ID0gMywgc2tpcCA9IDMpICU+JSANCiAgbmEub21pdCgpIA0KbmFtZXMoeCkgPC1jKCJzZWN0b3IiLCAyMDA0OjIwMjApDQp2YnBfY2NubiA8LSB4ICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sdmFsdWUgPSB2YnBfdG90ICwgMjpuY29sKC4pKQ0KDQp5IDwtIHJlYWRfZXhjZWwoIi4uL2RhdGEvaW5kZWMvc2hfVkJQX1ZBQl8wM18yMS54bHMiLCBzaGVldCA9IDUsIHNraXAgPSA0KSAlPiUgDQogIHNlbGVjdCgxLCBjb250YWlucygiVG90YWwiKSkgJT4lIA0KICBuYS5vbWl0KCkgDQpuYW1lcyh5KSA8LWMoInNlY3RvciIsIDIwMDQ6MjAyMCkNCnZhX2Njbm4gPC0geSAlPiUgDQogIGdhdGhlcihrZXkgPSBhbmlvLHZhbHVlID0gdmFfdG90ICwgMjpuY29sKC4pKQ0KDQpjY25uX29maWNpYWwgPC0gdmFfY2NubiAlPiUgDQogIGZpbHRlcihncmVwbCgiRXh0cmFjY2nDs24gZGUgcGV0csOzbGVvIiwgc2VjdG9yKSkgJT4lIA0KICBpbm5lcl9qb2luKHZicF9jY25uICU+JSBmaWx0ZXIoZ3JlcGwoIkV4dHJhY2Npw7NuIGRlIHBldHLDs2xlbyIsIHNlY3RvcikpLCBieSA9IGMoInNlY3RvciIsICJhbmlvIikpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpICU+JSANCiAgbGVmdF9qb2luKG1hc2Ffc2FsYXJpYWxfaGlkcm9jYXJidXJvcyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgdW5pZGFkLA0KICAgICAgICAgICAgICAgICAgICAgbXNfdG90ID0gbWFzYV9zYWxhcmlhbF90b3RhbF9vZWRlLA0KICAgICAgICAgICAgICAgICAgICAgbXNfZXh0ciA9bWFzYV9zYWxhcmlhbF9leHRyYWNjaW9uX29lZGUgKSwgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbXV0YXRlKHZicF9leHRyID0gdmJwX3RvdCogKDEgLSBzZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgdmFfZXh0ciA9IHZhX3RvdCogKDEgLSBzZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfdG90ID0gdmJwX3RvdCAtIHZhX3RvdCwNCiAgICAgICAgIGNpX2V4dHIgPSB2YnBfZXh0ciAgLSB2YV9leHRyLA0KICAgICAgICAgZWJlX3RvdCA9dmFfdG90LW1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyID0gdmFfZXh0ciAtbXNfZXh0ciwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgICBmdWVudGUgPSAiQ0NOTiBvZmljaWFsIiApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZnVlbnRlLCBldmVyeXRoaW5nKC4pLCAtc2VjdG9yKQ0KDQojIyBWQSB5IFZCUCBwcmVjaW9zIDkzDQp4IDwtIHJlYWRfZXhjZWwoIkM6L0FyY2hpdm9zL3JlcG9zL2hpZHJvY2FyYnVyb3MvYW5hbGlzaXMvZGF0YS9tZWNvbi9QQklfQmFzZSAxOTkzX1BNLnhsc3giLCANCiAgICBzaGVldCA9ICJWQlAgYyIsIGNvbF90eXBlcyA9IGMoInRleHQiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiwgIm51bWVyaWMiLCAibnVtZXJpYyIsIA0KICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCANCiAgICAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgDQogICAgICAgICJudW1lcmljIiksIHNraXAgPSA2KSAlPiUgDQogICAgc2VsZWN0KDEsICFjb250YWlucygiSSIpKQ0KbmFtZXMoeCkgPC0gYygic2VjdG9yIiwgMTk5MzoyMDA5KQ0KdmJwXzkzIDwtIHggJT4lIA0KICBnYXRoZXIoa2V5ID0gYW5pbyx2YWx1ZSA9IHZicF90b3QgLCAyOm5jb2woLikpDQoNCnkgPC0gcmVhZF9leGNlbCgiQzovQXJjaGl2b3MvcmVwb3MvaGlkcm9jYXJidXJvcy9hbmFsaXNpcy9kYXRhL21lY29uL1BCSV9CYXNlIDE5OTNfUE0ueGxzeCIsIA0KICAgIHNoZWV0ID0gIlZBQiBjIiwgc2tpcCA9IDYpICU+JSANCiAgICBzZWxlY3QoMSwgIWNvbnRhaW5zKCJJIikpDQpuYW1lcyh5KSA8LSBjKCJzZWN0b3IiLCAxOTkzOjIwMDkpDQp2YV85MyA8LSB5ICU+JSANCiAgZ2F0aGVyKGtleSA9IGFuaW8sdmFsdWUgPSB2YV90b3QgLCAyOm5jb2woLikpDQoNCnZhbG9yX3Byb2R1Y2Npb25fOTMgPC0gdmFfOTMgJT4lICBpbm5lcl9qb2luKHZicF85MykgJT4lIA0KICBtdXRhdGUoYW5pbyA9IGFzLmRvdWJsZShhbmlvKSkNCg0KY29uc3Vtb19pbnRlcm1lZGlvXzkzIDwtIHZhbG9yX3Byb2R1Y2Npb25fOTMgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoIkMgLSBFWFBMT1RBQ0lPTiBERSBNSU5BUyBZIENBTlRFUkFTIiwgc2VjdG9yKSkgJT4lIA0KICBtdXRhdGUoY29lZl90ZWNfOTMgPSAxLSh2YV90b3QvdmJwX3RvdCksIA0KICAgICAgICAgICBjb2VmX3RlY185M19pbmRleCA9IGdlbmVyYXJfaW5kaWNlKGNvZWZfdGVjXzkzLCBmZWNoYSA9IGFuaW8sIGZlY2hhX2Jhc2UgPSAyMDA0KSkNCiAgDQojIyBTZXJpZSBkZSBDSQ0KIyA8IDE5OTcgOiBNSVAgOTcNCiMgOTcgYSAyMDA0IDogcHJvZ3Jlc2lvbiBkZSBtaXA5NyBhIGluZGVjDQojIDIwMDQgYSAyMDE5OiBpbmRlYw0KY29lZl9jb25zdW1vX2ludGVybWVkaW8gPC0gZGF0YS5mcmFtZShhbmlvID0gMTk2MDoyMDIwKSAlPiUNCiAgbGVmdF9qb2luKGNjbm5fb2ZpY2lhbCAlPiUgIHNlbGVjdChhbmlvLCB2YnBfdG90LCB2YV90b3QpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4oY29uc3Vtb19pbnRlcm1lZGlvXzkzICU+JSBzZWxlY3QoYW5pbywgY29lZl90ZWNfOTNfaW5kZXgpKSAlPiUgDQogIG11dGF0ZShjb2VmX2NpID0gMS0odmFfdG90L3ZicF90b3QpKQ0KY2lfYmFzZSA9IGNvZWZfY29uc3Vtb19pbnRlcm1lZGlvJGNvZWZfY2lbY29lZl9jb25zdW1vX2ludGVybWVkaW8kYW5pbyA9PTIwMDRdDQoNCmNvZWZfY29uc3Vtb19pbnRlcm1lZGlvIDwtIGNvZWZfY29uc3Vtb19pbnRlcm1lZGlvICU+JSANCiAgbXV0YXRlKGNvZWZfY2kgPSBjYXNlX3doZW4oIGFuaW8gPD0gMjAwNCB+IGNvZWZfdGVjXzkzX2luZGV4ICogY2lfYmFzZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBjb2VmX2NpKSkgJT4lIA0KICAgICAgICAgIyBjb2VmX2NpID0gaW1wdXRlVFM6Om5hLmludGVycG9sYXRpb24oY29lZl9jaSwgb3B0aW9uID0gImxpbmVhciIgKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgY29lZl9jaSkNCmNvZWZfY29uc3Vtb19pbnRlcm1lZGlvDQpgYGANCg0KIyMjIEVzdGltYWNpb25lcyBwcm9waWFzIA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KI3ZhcmlhYmxlcyBwYXJhIGxhIGVzdGltYWNpw7NuIA0KcHJlY2lvc195X2NhbnRpZGFkZXMgPC0gcHJvZF9tZXJnZV9jcnVkbyAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudF9jcnVkbyA9IHVuaWRhZCwgcHJvZF9jcnVkbykgJT4lDQogIGxlZnRfam9pbihleHBvX3FfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfY3J1ZG8gPXVuaWRhZCwgZXhwb19jcnVkbykpICU+JSANCiAgbGVmdF9qb2luKGV4aXN0ZW5jaWFzX3BldHJvbGVvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50X2NydWRvID0gdW5pZGFkLCBleGlzdGVuY2lhc19jcnVkbykpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4aXN0ZW5jaWFzX2NydWRvPTAgKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZXhwb19jcnVkbz0wICkpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb19taV9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB1bmlkYWRfcHJlY2lvX2NydWRvID0gdW5pZGFkLCBwcmVjaW9fY3J1ZG9fbWRvaW50KSwgYnkgPSAiYW5pbyIpICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX3ByZWNpb19jcnVkbyA9IHVuaWRhZCwgcHJlY2lvX21lX2NydWRvKSwgYnkgPSBjKCJhbmlvIiwgInVuaWRhZF9wcmVjaW9fY3J1ZG8iKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJvZF9tZXJnZV9nYXNfTU1CVFUgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQscHJvZF9nYXMpLCBieSA9ICJhbmlvIikgJT4lDQogIGxlZnRfam9pbihleHBvX3FfZ2FzX01NQlRVICU+JSBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRfZ2FzPSB1bmlkYWQsIGV4cG9fZ2FzKSkgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcmVjaW9fZ2FzID0gdW5pZGFkLCBwcmVjaW9fZXh0ZXJub19nYXMsIHByZWNpb19leHBvcnRhY2lvbl9nYXNfYXIpLCBieSA9ICJhbmlvIikgJT4lIA0KICBsZWZ0X2pvaW4ocHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZCAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHJlY2lvX2dhc19tZG9pbnQpKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWxfYiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCB0Y3AsIHRjYyksIGJ5ID0gImFuaW8iKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gocHJlY2lvc195X2NhbnRpZGFkZXMsIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvaW5zdW1vc19jcml0ZXJpb19jY25uLnhsc3giKQ0KDQojIyBDcml0ZXJpbyBDQ05OIA0KY3JpdGVyaW9fY2NubiA8LSBwcmVjaW9zX3lfY2FudGlkYWRlcyAlPiUgDQogIGxlZnRfam9pbihjb2VmX2NvbnN1bW9faW50ZXJtZWRpbywgYnkgPSJhbmlvIikgJT4lIA0KICBtdXRhdGUoY3J1ZG9fbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbywNCiAgICAgICAgIGV4cG9fZ2FzID0gcmVwbGFjZV9uYShleHBvX2dhcywgMCApLA0KICAgICAgICAgZ2FzX21kb19pbnRlcm5vID0gcHJvZF9nYXMgLSBleHBvX2dhcywNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIA0KICAgICAgICAjIGNyaXRlcmlvIENDTk4NCiAgICAgICAgIHZicF90b3QgPSAoKGNydWRvX21kb19pbnRlcm5vKnByZWNpb19jcnVkb19tZG9pbnQrDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvX2NydWRvKnByZWNpb19tZV9jcnVkbw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2FzX21kb19pbnRlcm5vICogcHJlY2lvX2dhc19tZG9pbnQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK2V4cG9fZ2FzKnByZWNpb19leHBvcnRhY2lvbl9nYXNfYXIgKSp0Y2MpLzEwXjYsDQogICAgICAgICB2YnBfZXh0ciA9dmJwX3RvdCooMS1zZXJ2aWNpb19zX2V4dHJhY2Npb24pLA0KICAgICAgICAgY2lfdG90ID0gdmJwX3RvdCAqY29lZl9jaSAsDQogICAgICAgICBjaV9leHRyID0gdmJwX2V4dHIgKiBjb2VmX2NpLA0KICAgICAgICB2YV90b3Q9ICAgdmJwX3RvdCAtIGNpX3RvdCwNCiAgICAgICAgdmFfZXh0cj0gICB2YnBfZXh0ciAtIGNpX2V4dHIsDQogICAgICAgIG1zX2V4dHIgPSB2YnBfZXh0ciAqIG1lYW5fY29lZl9tcyRjb2VmX21zX2V4dHIsDQogICAgICAgICBtc190b3QgPSB2YnBfdG90ICogbWVhbl9jb2VmX21zJGNvZWZfbXNfdG90LA0KICAgICAgICAgZWJlX3RvdCA9IHZhX3RvdCAtIG1zX3RvdCwNCiAgICAgICAgIGViZV9leHRyPXZhX2V4dHIgLSBtc190b3QgICwNCiAgICAgICAgZnVlbnRlID0gIkNyaXRlcmlvIENDTk4iKQ0KY3JpdGVyaW9fY2Nubg0KDQoNCiMgRW1wYWxtZSBDQ05ODQppbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4gPC0gY3JpdGVyaW9fY2NubiAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSh2YnBfY3JpdGVyaW9fY2Nubl8wNCA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhID0gYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGFfYmFzZSA9IDIwMDQpICkgJT4lICMgLA0KICAgICAgICAgIyB2YnBfY3JpdGVyaW9fY2Nubl8xMiA9IGdlbmVyYXJfaW5kaWNlKHZicF90b3QsDQogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVjaGEgPSBhbmlvLA0KICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlY2hhX2Jhc2UgPSAyMDEyKSkgJT4lIA0KICBzZWxlY3QoYW5pbywgdmJwX2NyaXRlcmlvX2Njbm5fMDQpDQoNCmVtcGFsbWVfY2NubiA8LSBjY25uX29maWNpYWwgJT4lIA0KICBmdWxsX2pvaW4oY29lZl9jb25zdW1vX2ludGVybWVkaW8sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGZ1bGxfam9pbihpbmRpY2VfdmJwX2NyaXRlcmlvX2Njbm4sIGJ5ID0gImFuaW8iKSAlPiUgDQogIGFycmFuZ2UoYW5pbykgJT4lIA0KICBtdXRhdGUodmJwX2V4dHIgPSBjYXNlX3doZW4oYW5pbyA8IDIwMDQgfiBjY25uX29maWNpYWwkdmJwX2V4dHJbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfZXh0cikgLA0KICAgIHZicF90b3QgPSBjYXNlX3doZW4oIGFuaW8gPCAyMDA0IH4gY2Nubl9vZmljaWFsJHZicF90b3RbY2Nubl9vZmljaWFsJGFuaW8gPT0gMjAwNF0gKiB2YnBfY3JpdGVyaW9fY2Nubl8wNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YnBfdG90KSwNCiAgICBjaV9leHRyID0gdmJwX2V4dHIgKiBjb2VmX2NpICwNCiAgICBjaV90b3QgPSB2YnBfdG90ICpjb2VmX2NpICAgLA0KICAgIHZhX3RvdCA9IGNhc2Vfd2hlbihpcy5uYSh2YV90b3QpIH4gdmJwX3RvdCAtIGNpX3RvdCAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiB2YV90b3QpLA0KICAgIHZhX2V4dHIgPSBjYXNlX3doZW4oaXMubmEodmFfZXh0cikgfiB2YnBfZXh0ciAtIGNpX2V4dHIgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gdmFfZXh0ciksDQogICAgbXNfdG90ID0gY2FzZV93aGVuKGlzLm5hKG1zX3RvdCkgfiB2YnBfdG90Km1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IG1zX3RvdCkgLA0KICAgIG1zX2V4dHIgPSBjYXNlX3doZW4oaXMubmEobXNfZXh0cikgfiB2YnBfdG90Km1lYW5fY29lZl9tcyRjb2VmX21zX2V4dHIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgfiBtc19leHRyKSwgDQogICAgZWJlX3RvdCA9IGNhc2Vfd2hlbihpcy5uYShlYmVfdG90KSB+IHZhX3RvdCAtbXNfdG90LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIH4gZWJlX3RvdCksDQogICAgZWJlX2V4dHIgPSBjYXNlX3doZW4oaXMubmEoZWJlX2V4dHIpIH4gdmFfZXh0ciAtbXNfZXh0ciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IGViZV9leHRyKSwNCiAgICBmdWVudGUgPSAiRW1wYWxtZSBDQ05OIiwNCiAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUNCiAgICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZV9wcHllID09ICJCb2xzYXIiKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JQ0KICBtdXRhdGUoIHB2ID0gZWJlX2V4dHIgLSBjb25zdW1vX2tfZmlqbyAtICh2YnBfdG90ICogaW1wX3Byb21fOTcpKQ0KICANCg0KIyMgQ3JpdGVyaW8gcHJvcGlvIA0KY3JpdGVyaW9fcHJvcGlvIDwtIHByZWNpb3NfeV9jYW50aWRhZGVzICU+JQ0KICBsZWZ0X2pvaW4oZW1wYWxtZV9jY25uICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sdW5pZGFkLCBjaV90b3QsIGNpX2V4dHIsIG1zX3RvdCwgbXNfZXh0ciApICkgJT4lIA0KICBsZWZ0X2pvaW4oc3RvY2tfZXN0aW1hZG8gJT4lDQogICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSkgJT4lDQogICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZnVlbnRlX3BweWUgPT0gIkJvbHNhciIpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGNvbnN1bW9fa19maWpvID0gdmFsb3IgKiBpcGNfMTggKiBjb25zdW1vX2tfZmlqb195cGYpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBjb25zdW1vX2tfZmlqbykpICU+JSANCiAgbXV0YXRlKA0KICAgICAgICAjIGNyaXRlcmlvIHByb3Bpbw0KICAgICAgICAgdmJwX3RvdCA9KCAocHJvZF9jcnVkbypwcmVjaW9fbWVfY3J1ZG8gICsgcHJvZF9nYXMgKiBwcmVjaW9fZXh0ZXJub19nYXMpICogdGNwKS8xMF42LA0KICAgICAgICAgdmFfdG90ID0gdmJwX3RvdCAtIGNpX2V4dHIsDQogICAgICAgICBlYmVfdG90ID0gdmFfdG90IC0gbXNfZXh0ciAsDQogICAgICAgICB2YnBfZXh0ciA9ICBOQSAsDQogICAgICAgICBlYmVfZXh0ciA9TkEsDQogICAgICAgICB2YV9leHRyPU5BLCANCiAgICAgICAgIGZ1ZW50ZSA9ICJDcml0ZXJpbyBwcm9waW8iLCB1bmlkYWQgPSJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIiAsDQogICAgICAgICAgcHYgPSBlYmVfdG90IC0gY29uc3Vtb19rX2Zpam8gLSAodmJwX3RvdCAqIGltcF9wcm9tXzk3KSkNCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZmlsdHJvIDwtIGMoImFuaW8iLCAidW5pZGFkIiwgImZ1ZW50ZSIsICJ2YnBfdG90IiwgInZicF9leHRyIiwNCiAgICAgICAgICAgICJjaV90b3QiLCAiY2lfZXh0ciIsICAibXNfdG90IiwgIm1zX2V4dHIiLA0KICAgICAgICAgICAgInZhX3RvdCIsICAidmFfZXh0ciIgLCAiZWJlX3RvdCIsICJlYmVfZXh0ciIgICkNCg0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbl9jb3JyIDwtIGNjbm5fb2ZpY2lhbCAlPiUgDQogIHNlbGVjdChmaWx0cm8pICU+JSANCiAgIyByYmluZChjcml0ZXJpb19jY25uICU+JXNlbGVjdChmaWx0cm8pKSAlPiUgDQogIHJiaW5kKGVtcGFsbWVfY2NubiAlPiUgc2VsZWN0KGZpbHRybykpICU+JSANCiAgcmJpbmQoY3JpdGVyaW9fcHJvcGlvICU+JSBzZWxlY3QoZmlsdHJvKSkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdmFyaWFibGUsIHZhbHVlPXZhbG9yLCA0OjEyKSANCg0KdmFsb3JfdG90YWxfcHJvZHVjY2lvbiA8LSAgdmFsb3JfdG90YWxfcHJvZHVjY2lvbl9jb3JyICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JQ0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvaXBjXzE4LA0KICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKQ0KDQoNCiAgDQoNCmdyYWZfdmFsb3JfcHJvZHVjY2lvbiA8LSB2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgZmlsdGVyKGFuaW8gPiAxOTYwKSAlPiUgDQogIGdncGxvdCggYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGZ1ZW50ZSkpKw0KICBnZW9tX2xpbmUoYWxwaGEgPSAwLjcpKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjQzNSwgYWxwaGEgPSAwLjIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJWYWxvciBkZSBsYSBQcm9kdWNjacOzbiBoaWRyb2NhcmJ1csOtZmVyYSIsIA0KICAgICAgIHN1YnRpdGxlID0gIlZhbG9yIHRvdGFsIHkgY29tcG9uZW50ZXMiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICBmYWNldF93cmFwKH52YXJpYWJsZSkNCmdwIDwtIGdncGxvdGx5KGdyYWZfdmFsb3JfcHJvZHVjY2lvbiwgd2lkdGggPSA3NTAsIGhlaWdodCA9IDgwMCkgIA0KZ3BbWyd4J11dW1snbGF5b3V0J11dW1snYW5ub3RhdGlvbnMnXV1bWzJdXVtbJ3gnXV0gPC0gLTAuMTENCmdwICU+JSBsYXlvdXQobWFyZ2luID0gbGlzdChsID0gNzUpKQ0KDQoNCmBgYA0KDQoNCg0KDQojIFRhc2EgZGUgR2FuYW5jaWENCg0KDQokJFRHX3toaWRyb2NhcmJ1cm9zfSA9IFxmcmFje1BWX3toaWRyb2NhcmJ1csOtZmVyYX19e0tUQV97aGlkcm9jYXJidXLDrWZlcm99fSQkDQoNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiNsZXZhbnRvIGRhdGEgc2V0cyBkZSBvdHJvIFIgbWFya2Rvd24NCmJhbGFuY2VzX2FyZyA8LSByZWFkX2NzdigiQzovQXJjaGl2b3MvRGF0b3MvQmFsYW5jZXMvZ2FzIHkgcGV0cm9sZW9fZGF0b3MvZGF0b3Nfci9yZXN1bHRhZG9zL2JhbGFuY2VzX2FyZy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKGZlY2hhID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLSVtLSVkIiksIFgxID0gY29sX3NraXAoKSkpDQoNCnBldHJvYnJhc19hcmdfc2VnbWVudG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MvcGV0cm9icmFzX2FyZ19zZWdtZW50b3MuY3N2IiwgDQogICAgY29sX3R5cGVzID0gY29scyhYMSA9IGNvbF9za2lwKCkpKQ0KDQp5cGZfc2VnbWVudG9zIDwtIHJlYWRfY3N2KCJDOi9BcmNoaXZvcy9EYXRvcy9CYWxhbmNlcy9nYXMgeSBwZXRyb2xlb19kYXRvcy9kYXRvc19yL3Jlc3VsdGFkb3MveXBmX3NlZ21lbnRvcy5jc3YiLCANCiAgICBjb2xfdHlwZXMgPSBjb2xzKFgxID0gY29sX3NraXAoKSkpDQoNCmBgYA0KDQojIyBQb3IgZW1wcmVzYQ0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdyYWZfdGdfZW1wIDwtIGJhbGFuY2VzX2FyZyAlPiUNCiAgZmlsdGVyKHRnX2FudCAhPSBJbmYpICU+JSANCiAgZ2dwbG90KGFlcyhmZWNoYSwgdGdfYW50LCBjb2xvciA9IGVtcHJlc2EpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZW1wcmVzYXMgaGlkcm9jYXJidXJvcyIsDQogICAgICAgc3VidGl0bGUgPSAgIkFudGVzIGRlIGltcHVlc3RvcyIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGZhY2V0X3dyYXAofnNlY3RvcikNCg0KZ2dwbG90bHkoZ3JhZl90Z19lbXAsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQpgYGANCg0KIyMgUG9yIHN1YnNlY3Rvcg0KDQpgYGB7cn0NCmJhbGFuY2VzX2FyZyAlPiUgDQogIGZpbHRlcih1bmlkYWQgPT0gIk1pbGxvbmVzIGRlIHBlc29zIikgJT4lIA0KICBncm91cF9ieShmZWNoYSwgc2VjdG9yKSAlPiUgDQogIHN1bW1hcmlzZSgiVEcgYW50ZXMgZGUgaW1wdWVzdG9zIiA9IHN1bShnY2lhX2FudCxuYS5ybSA9IFQpL3N1bSAoS1RBLG5hLnJtID0gVCksDQogICAgICAgICAiVEcgZGVzcHVlcyBkZSBpbXB1ZXN0b3MiID0gc3VtKGdjaWFfYW50LCBpbXB1ZXN0b19nY2lhLCBuYS5ybSA9IFQpL3N1bShLVEEsIG5hLnJtID0gVCApICkgJT4lDQogIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSB2YWxvciwgMzo0KSAlPiUgDQogIGZpbHRlcih2YXJpYWJsZSA9PSJURyBkZXNwdWVzIGRlIGltcHVlc3RvcyIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB2YWxvciwgY29sb3IgPSBzZWN0b3IpKSsgDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZW1wcmVzYXMgaGlkcm9jYXJidXJvcyIsDQogICAgICAgc3VidGl0bGUgPSAgIkFudGVzIHkgZGVzcHXDqXMgZGUgaW1wdWVzdG9zIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKSsNCiAgZmFjZXRfd3JhcCh+dmFyaWFibGUpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpncmFmX3RnX3lwZiA8LSB5cGZfc2VnICU+JSANCiAgIyBmaWx0ZXIoc2VjdG9yICVpbiUgYygicXVpbWljYSIsICJkb3duc3RyZWFtIiwgInVwc3RyZWFtIikpICU+JQ0KICBmaWx0ZXIoc2VjdG9yICE9ICJhZG1fY2VudHJhbCIpICU+JQ0KICBnZ3Bsb3QoYWVzKGZlY2hhLCB0Z19hY3Rpdm8sIGNvbG9yID0gc2VjdG9yKSkrIA0KICBnZW9tX2xpbmUoKSsNCiAgZ2VvbV9wb2ludCgpKw0KICAjIGZhY2V0X3dyYXAofnNlY3RvcikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBkZSBzZWdtZW50b3MgWVBGIikNCmdyYWZfdGdfeXBmDQpgYGANCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ3JhZl90Z19wZXRyb2JyYXMgPC0gcGV0cm9icmFzX2FyX3NlZyAlPiUgDQogIGZpbHRlcihzZWN0b3IgJWluJSBjKCJwZXRyb3F1aW1pY2EiLCAiZG93bnN0cmVhbSIsICJ1cHN0cmVhbSIsICJnYXNfeV9lbmVyZ2lhIikpICU+JQ0KICAjIGZpbHRlcihzZWN0b3IgIT0gImFkbV9jZW50cmFsIikgJT4lDQogIGdncGxvdChhZXMoZmVjaGEsIHRnLCBjb2xvciA9IHNlY3RvcikpKw0KICBnZW9tX2xpbmUoKSsNCiAgIyBmYWNldF93cmFwKH5zZWN0b3IpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpKw0KICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgZGUgc2VnbWVudG9zIFBldHJvYnJhcyBBcmdlbnRpbmEiKQ0KZ3JhZl90Z19wZXRyb2JyYXMNCmBgYA0KIyNUb3RhbCByYW1hDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UgICAsZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTV9DQoNCnRhc2FfZ2FuYW5jaWFfcmFtYSA8LSBlbXBhbG1lX2Njbm4gJT4lDQogIGRpc3RpbmN0KCkgJT4lIA0KICAgIGZpbHRlcihhbmlvID4xOTk3KSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHB2KSAlPiUgDQogICAgIyBsZWZ0X2pvaW4oc3RvY2tfeV9wb3pvcyAlPiUgDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcHllID0gcHB5ZV9lc3RpbWFkbywgc3RvY2tfc2VsZWNjaW9uYWRvID0gZnVlbnRlX3BweWUsIGZ1ZW50ZV9wb3pvKSwNCiAgIyAgICAgICAgICAgYnkgPSBjKCJhbmlvIikpICU+JSANCiAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JQ0KICAgICAgICAgICAgICBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICwgYnkgPSAiYW5pbyIpICU+JSANCiAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUoZnVlbnRlX3Bvem8gPSAiRXN0aW1hY2nDs24gc2luIHBvem9zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsb3IgPSB2YWxvciAqaXBjXzE4KSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICBwcHllID0gdmFsb3IsIHN0b2NrX3NlbGVjY2lvbmFkbyA9IGZ1ZW50ZV9wcHllLCBmdWVudGVfcG96byksDQogICAgICAgICAgICBieSA9IGMoImFuaW8iKSkgJT4lIA0KICBtdXRhdGUodGFzYV9nYW5hbmNpYSA9IHB2L3BweWUpICU+JSANCiAgZmlsdGVyKCFpcy5uYShzdG9ja19zZWxlY2Npb25hZG8pKSAlPiUgDQogIHNlbGVjdCgtZnVlbnRlX3Bvem8pDQoNCmdyYWZfdGdfcmFtYV8xIDwtIHRhc2FfZ2FuYW5jaWFfcmFtYSU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHRhc2FfZ2FuYW5jaWEsIGNvbG9yID1zdG9ja19zZWxlY2Npb25hZG8gKSkrDQogIGdlb21fbGluZShhbHBoYSA9IDAuNSkrDQogIGdlb21fcG9pbnQoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiVGFzYSBkZSBnYW5hbmNpYSBoaWRyb2NhcmJ1csOtZmVyYSBjb24gUFB5RSBkZSBleHRyYWNjacOzbiIpIA0KICAjIGZhY2V0X3dyYXAofnN0b2NrX3NlbGVjY2lvbmFkbykNCiMgZ2dwbG90bHkoZ3JhZl90Z19yYW1hXzEsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQpncmFmX3RnX3JhbWFfMQ0KDQojIyMjIyMjIyMjIyMNCg0KIyAjZWwgREYgdGFzYV9nYW5hbmNpYV9yYW1hX3N0b2NrIGNvbnRpZW5lIGxhcyBlc3RpbWFjaW9uZXMgZGlzdGludGFzIGVzdGltYWNpb25lcyBkZSBLVEEgY29uIHN0b2NrIGRlIHBvem9zIA0KIyB0YXNhX2dhbmFuY2lhX3JhbWFfc3RvY2sgPC0gdmFsb3JfdG90YWxfcHJvZHVjY2lvbiAlPiUNCiMgICBmaWx0ZXIodmFyaWFibGUgPT0gImV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiIgJiBmdWVudGUgPT0gIkNyaXRlcmlvIHByb3BpbyBjb24gVkJQIENDTk4iICkgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCB1bmlkYWQsIGV4Y2VkZW50ZV9icnV0b19leHBsb3RhY2lvbiA9IHZhbG9yKSAlPiUgDQojICAgbGVmdF9qb2luKHN0b2NrX2VzdGltYWRvICU+JSANCiMgICAgICAgICAgICAgICAjIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoInBweWVfZXN0aW1hZG9fYWZpcCIsICJwcHllX2VzdGltYWRvX2JvbHNhciIsDQojICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICJwcHllX2VzdGltYWRvX3RvdGFsIikpICU+JQ0KIyAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX2JvbHNhciIpICU+JQ0KIyAgICAgICAgICAgICAgICMgZmlsdGVyKHZhcmlhYmxlID09ICJwcHllX2VzdGltYWRvX3RvdGFsIikgJT4lDQojICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgIHBweWUgPSB2YWxvciwgc3RvY2tfc2VsZWNjaW9uYWRvID0gZnVlbnRlX3BweWUpICU+JSANCiMgICAgICAgICAgICAgICBtdXRhdGUodW5pZGFkID0gIk1pbGxvbmVzIGRlIHBlc29zIGRlIDIwMTgiKSkgJT4lIA0KIyAgIG11dGF0ZSh0YXNhX2dhbmFuY2lhID0gZXhjZWRlbnRlX2JydXRvX2V4cGxvdGFjaW9uL3BweWUpDQojIA0KIyBncmFmX3RnX3JhbWFfMiA8LSB0YXNhX2dhbmFuY2lhX3JhbWFfc3RvY2sgJT4lIA0KIyAgIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQojICAgZ2dwbG90KGFlcyhhbmlvLCB0YXNhX2dhbmFuY2lhLCBjb2xvciA9IHN0b2NrX3NlbGVjY2lvbmFkbykpKw0KIyAgIGdlb21fbGluZShhbHBoYSA9IDAuNSkrDQojICAgZ2VvbV9wb2ludCgpKw0KIyAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpKw0KIyAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLA0KIyAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlRhc2EgZGUgZ2FuYW5jaWEgaGlkcm9jYXJidXLDrWZlcmEgY29uIFBQeUUgYSBwYXJ0aXIgZGUgc3RvY2sgZGUgcG96b3MgKDE5NjAgLSAyMDE4KSIpDQojICMgZ2dwbG90bHkoZ3JhZl90Z19yYW1hXzIsIHdpZHRoID0gODAwLCBoZWlnaHQgPSA2MDApDQojIGdyYWZfdGdfcmFtYV8yDQoNCmBgYA0KDQojIyBSZW50YSBhcHJvcGlhZGEgcG9yIGxhcyBlbXByZXNhcyBkZSBsYSByYW1hDQoNCkxhIHJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWEgc2UgY2FsY3VsYSBwb3IgbWVkaW8gZGVsIGRpZmVyZW5jaWFsIGRlIHRhc2FzIGRlIGdhbmFuY2lhIGVudHJlIGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyBxdWUgc3VyZ2UgYSBwYXJ0aXIgZGUgbG9zIGJhbGFuY2VzIHkgbGEgcmVudGFiaWxpZGFkIG5vcm1hbCBkZSBsYSBlY29ub23DrWEuDQoNCiQkUmVudGFcX2VtcHJlc2FzID0gS1RBX3toaWRyb2NhcmJ1csOtZmVyb30gKiAoVEdfe2hpZHJvY2FyYnVyw61mZXJhfSAtIFRHX3tyZWZlcmVuY2lhfSkkJA0KJCRUR197aGlkcm9jYXJidXLDrWZlcmF9ID0gXGZyYWN7R2NpYV97aGlkcm9jYXJidXJvc319e0tUQV97aGlkcm9jYXJidXLDrWZlcm99fSQkIA0KUG9yIGxvIGN1YWwsIGxhIHJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIGVtcHJlc2FzIGRlIGxhIHJhbWEgc2Vyw61hIGVxdWl2YWxlbnRlIGE6DQoNCiQkUmVudGFcX2VtcHJlc2FzID0gR2NpYV97aGlkcm9jYXJidXJvc30gLSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqICBUR197cmVmZXJlbmNpYX0kJA0KDQpEb25kZToNCg0KKiAkS1RBX3toaWRyb2NhcmJ1csOtZmVyb30kID0gU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KKiAkVEdfe2hpZHJvY2FyYnVyw61mZXJhfSQgPSBUYXNhIGRlIGdhbmFuY2lhIGRlIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcw0KKiAkVEdfe3JlZmVyZW5jaWF9JCA9IFRhc2EgZGUgZ2FuYW5jaWEgZGUgcmVmZXJlbmNpYQ0KKiAkR2NpYV97aGlkcm9jYXJidXJvc30kID0gR2FuYW5jaWEgZGUgZW1wcmVzYXMgaGlkcm9jYXJidXLDrWZlcmFzDQoNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiAgDQp0Z19pbmR1c3RyaWFsIDwtIHJlYWRfZGVsaW0oIkM6L0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvVEcvdGdfaW5kdXN0cmlhbC5jc3YiLCANCiAgICAiOyIsIGVzY2FwZV9kb3VibGUgPSBGQUxTRSwgdHJpbV93cyA9IFRSVUUpICU+JSANCiAgbXV0YXRlKGFuaW8gPSBhcy5kb3VibGUoYW5pbykpDQoNCnJlbnRhX3RnIDwtICB0YXNhX2dhbmFuY2lhX3JhbWEgJT4lDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHN0b2NrX3NlbGVjY2lvbmFkbywgIHBweWUgLCB0YXNhX2dhbmFuY2lhKSAlPiUgDQogICMgZmlsdGVyKHN0b2NrX3NlbGVjY2lvbmFkbyA9PSAicHB5ZV9ib2xzYXIiLGZ1ZW50ZV9wb3pvID09ICJwb3pvc19jYXJnYWRvc19zZWNfZW5lcmdpYSIgKSAlPiUgDQogIGxlZnRfam9pbih0Z19pbmR1c3RyaWFsLCBieSA9ICJhbmlvIikgJT4lIA0KICByZW5hbWUodGdfaGlkcm9jYXJidXJvcyA9IHRhc2FfZ2FuYW5jaWEpICU+JSANCiAgbXV0YXRlKHVuaW9uX3RnID0gY2FzZV93aGVuKGFuaW8gPCAxOTkzIH4gdGdfaW5kdV9qaWMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmlvID49IDE5OTMgfiB0Z19pbmR1X2VtKSwNCiAgICAgICAgIHJlbnRhX2Nvbl90Z19qaWMgPSBwcHllICoodGdfaGlkcm9jYXJidXJvcyAtIHRnX2luZHVfamljKSwNCiAgICAgICAgIHJlbnRhX2Nvbl90Z19lbSA9IHBweWUgKih0Z19oaWRyb2NhcmJ1cm9zIC0gdGdfaW5kdV9lbSksDQogICAgICAgICByZW50YV9jb25fdGdfdW5pb24gPSBwcHllICoodGdfaGlkcm9jYXJidXJvcyAtIHVuaW9uX3RnKSkgJT4lIA0KICBkaXN0aW5jdCgpDQoNCmdyYWZfdGdfcmFtYSA8LSByZW50YV90ZyAlPiUNCiAgZmlsdGVyKCFpcy5uYShzdG9ja19zZWxlY2Npb25hZG8pKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSByZW50YSwNCiAgICAgICAgIGMocmVudGFfY29uX3RnX2ppYywgcmVudGFfY29uX3RnX2VtLHJlbnRhX2Nvbl90Z191bmlvbiApKSAlPiUgDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUgDQogIG11dGF0ZShyZW50YSA9IHJlbnRhL2lwY18xOCkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHJlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSJkb2RnZSIpKw0KICAjIGdlb21fcG9pbnQoKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgdGFzYXMgZGUgZ2FuYW5jaWEiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkrICBmYWNldF93cmFwKH5zdG9ja19zZWxlY2Npb25hZG8sIG5jb2wgPSAxKQ0KZ2dwbG90bHkoZ3JhZl90Z19yYW1hLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMgPC0gcmVhZF9jc3YoIkM6L0FyY2hpdm9zL0RhdG9zL0JhbGFuY2VzL2dhcyB5IHBldHJvbGVvX2RhdG9zL2RhdG9zX3IvcmVzdWx0YWRvcy9yZW50YV9lbXByZXNhLmNzdiIsIA0KICAgIGNvbF90eXBlcyA9IGNvbHMoWDEgPSBjb2xfc2tpcCgpKSkgDQoNCnJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgPC0gIHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzICU+JSANCiAgZmlsdGVyKCEoZW1wcmVzYSAlaW4lIGMoImNoZXZyb25fZ2xvYmFsIiwgInBldHJvYnJhc19nbG9iYWwiICkpLA0KICAgICAgICAgc2VjdG9yICVpbiUgYyggImludGVncmFkYSIsICJwcm9kdWNjaW9uIikNCiAgICAgICAgICkgJT4lIA0KICBncm91cF9ieShmZWNoYSwgdW5pZGFkKSAlPiUgDQogIHN1bW1hcmlzZShLVEEgPSBzdW0oS1RBLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZ2FuYW5jaWFfZW1wcmVzYXNfYW50ZXNfaW1wdWVzdG9zID0gc3VtKGdjaWFfYW50LCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgZ2FuYW5jaWFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSBzdW0oZ2NpYV9kZXNwLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfYW50ZXNfaW1wdWVzdG9zID0gc3VtKHJlbnRhX2FudF9jb3JyLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgcmVudGFfZW1wcmVzYXNfZGVzcF9pbXB1ZXN0b3MgPSBzdW0ocmVudGFfZGVzcF9jb3JyLCBuYS5ybSA9IFQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIG11dGF0ZSggYW5pbyA9IGx1YnJpZGF0ZTo6eWVhcihmZWNoYSkpICU+JSANCiAgc2VsZWN0KGFuaW8sIGV2ZXJ5dGhpbmcoLiksIC1mZWNoYSkNCg0KZ3JhZl9yZW50YV9lbXAgPC0gcmVudGFfZW1wcmVzYXNfYmFsYW5jZXMgJT4lDQogIGZpbHRlcihzZWN0b3IgIT0gImRpc3RyaWJ1Y2lvbiIpICU+JSANCiAgZmlsdGVyKCFpcy5uYShyZW50YV9kZXNwX3AxOCksDQogICAgICAgICAhKGVtcHJlc2EgJWluJSBjKCJjaGV2cm9uX2dsb2JhbCIsICJwZXRyb2JyYXNfZ2xvYmFsIiApKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGZlY2hhLCByZW50YV9kZXNwX3AxOCwgZmlsbCA9IGVtcHJlc2EpKSArIA0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJzdGFjayIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHBvciBlbXByZXNhIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJNaWxsb25lcyBkZSBwZXNvcyBjb3JyaWVudGVzIikrDQogIGZhY2V0X3dyYXAofnNlY3RvcikNCg0KZ2dwbG90bHkoZ3JhZl9yZW50YV9lbXAsIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCmBgYA0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZWplcmNpY2lvIDwtIHZhbG9yX3RvdGFsX3Byb2R1Y2Npb24gJT4lIA0KICBmaWx0ZXIodmFyaWFibGUgPT0gInZhX3RvdCIpICU+JSANCiAgIyBmdWxsX2pvaW4oc3RvY2tfcmFtYSAlPiUNCiAgIyAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmFtYSA9IHNlY3RvciwgYWN0aXZvcyA9IHZhcmlhYmxlLCB2YWxvcl9hY3Rpdm9zID0gdmFsb3IsIA0KICAjICAgICAgICAgICAgICAgICAgICBmdWVudGVfYWN0aXZvcyA9IGZ1ZW50ZSkgJT4lIA0KICAjICAgICAgICAgICAgICMgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJBRklQIikpJT4lDQogICMgICAgICAgICAgICAgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJCb2xzYXIiKSklPiUNCiAgZnVsbF9qb2luKHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzICU+JQ0KICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoZW1wcmVzYSA9PSAiWVBGIikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmFtYSA9IHNlY3RvciwgYWN0aXZvcyA9IHZhcmlhYmxlLCB2YWxvcl9hY3Rpdm9zID0gdmFsb3IpKSAlPiUgDQogICAgICAgICAgICAgICMgZmlsdGVyKGZ1ZW50ZV9hY3Rpdm9zID09ICJCb2xzYXIiKSklPiUNCiAgbXV0YXRlKHJlbGFjaW9uID0gdmFsb3JfYWN0aXZvcy92YWxvcikgJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDE5OTAsICEoaXMubmEoYWN0aXZvcykpKQ0KZWplcmNpY2lvICAgICAgICAgICAgDQogIA0KZ3JhZl9yZWxhY2lvbiA8LSBlamVyY2ljaW8gJT4lIA0KICAjIGdncGxvdCggYWVzKGFuaW8sIHJlbGFjaW9uLCBjb2xvciA9IHJhbWEpKSsNCiAgZ2dwbG90KCBhZXMoYW5pbywgcmVsYWNpb24sIGNvbG9yID0gZnVlbnRlKSkrDQogICMgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiQWN0aXZvIHNvYnJlIHZhbG9yIGFncmVnYWRvIikrDQogIGZhY2V0X3dyYXAofmFjdGl2b3MpIA0KDQogIGdncGxvdGx5KGdyYWZfcmVsYWNpb24sIHdpZHRoID0gNjAwLCBoZWlnaHQgPSA0MDApDQoNCg0KYGBgDQoNCg0KDQojIFJlbnRhIHBvciBlbCBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGVudHJlIGVsIG1lcmNhZG8gaW50ZXJubyB5IGxhcyByZWZlcmVuY2lhcyBpbnRlcm5hY2lvbmFsZXMgDQoNClJlbnRhIGFwcm9waWFkYSBtZWRpYW50ZSBlbCBhYmFyYXRhbWllbnRvIGVuIGVsIGNvbnN1bW8gaW50ZXJubyBwb3IgZWZlY3RvIGRlbCBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8vZXh0ZXJubywgc29icmV2YWx1YWNpw7NuIGRlIGxhIG1vbmVkYSB5IHJldGVuY2lvbmVzIGEgbGEgZXhwb3J0YWNpw7NuDQoNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIEpLICh2YXJpYWJsZSAncmVudGFfZGlmX3ByZWNpb3MnKQ0KDQokJFJEUD0gUHJvZEludCAqIFBleHQgKiBUQ1AgLSBQcm9kSW50ICogUE1JICogVENDJCQNCg0KRG9uZGU6DQoNCiogJFJEUCQgPSBSZW50YSBhcHJvcGlhZGEgcG9yIGVmZWN0byBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8vZXh0ZXJubyB5IHNvYnJldmFsdWFjacOzbg0KKiAkTWRvSW50JCA9IFByb2R1Y2Npw7NuIGRlc3RpbmFkYSBhbCBNZXJjYWRvIEludGVybm86IFByb2R1Y2Npw7NuIC0gRXhwb3J0YWNpb25lcyAtIEV4aXN0ZW5jaWFzIChiYXJyaWxlcyBkZSBwZXRyw7NsZW8gw7MgTU1CVFUpDQoqICRQZXh0JCA9IFByZWNpbyBkZSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIGV4dGVybm8gKFVTRCkNCiogJFBNSSQgPSBQcmVjaW8gZGUgdmVudGEgZGVsIG1lcmNhZG8gaW50ZXJubyAoVVNEKQ0KKiAkVENQJCA9IFRpcG8gZGUgQ2FtYmlvIGRlIFBhcmlkYWQNCiogJFRDQyQgPSBUaXBvIGRlIENhbWJpbyBDb21lcmNpYWwNCg0KIyMjIENyaXRlcmlvIGRlIGPDs21wdXRvIGRlIEpJQyB5IGNpYSAodmFyaWFibGUgJ3JlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24nKQ0KJCRSRFAgPSBNZG9JbnQgKiBQTUkgKiAoXGZyYWN7VENQfXtUQ0N9ICAtIDEpJCQgIA0KDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQpyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA8LSBwcm9kX21lcmdlX2NydWRvICU+JSANCiAgIyBmaWx0ZXIoYW5pbyA+IDE5OTApICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgcHJvZF9jcnVkbykgJT4lIA0KICBsZWZ0X2pvaW4oZXhwb19xX2NydWRvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgZXhwb19jcnVkbykpICU+JSAjdW5pb24gY29uIGV4cG8NCiAgbGVmdF9qb2luKGV4aXN0ZW5jaWFzX3BldHJvbGVvKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChleGlzdGVuY2lhc19jcnVkbz0wICkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KGV4cG9fY3J1ZG89MCApKSAlPiUgDQogICMgbXV0YXRlKHByb2RfbWRvX2ludGVybm8gPSBwcm9kX2NydWRvIC0gZXhwb19jcnVkbyAtIGV4aXN0ZW5jaWFzX2NydWRvKSAlPiUgDQogIG11dGF0ZShwcm9kX21kb19pbnRlcm5vID0gcHJvZF9jcnVkbyAtIGV4cG9fY3J1ZG8gKSAlPiUgDQogIGxlZnRfam9pbihwcmVjaW9fbWlfY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcHJlY2lvX2NydWRvX21kb2ludCksDQogICAgICAgICAgICBieSA9IGMoImFuaW8iKSkgJT4lICAjIHVubyBjb24gcHJlY2lvIGludGVybm8NCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoYnJlbnQgPSBjYXNlX3doZW4oYW5pbyA8IDE5ODcgfiBicmVudF9oaXN0b3JpYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW8gPj0gMTk4NyB+IGJyZW50X2llYSApKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBwcmVjaW9fbWVfY3J1ZG8sIGJyZW50ICksDQogICAgICAgICAgICBieSA9IGMoImFuaW8iKSkgJT4lICAgIyB1bm8gY29uIHByZWNpbyBleHRlcm5vIA0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19jcnVkbyA9IHByb2RfbWRvX2ludGVybm8qcHJlY2lvX21lX2NydWRvKnRjcCAtIHByb2RfbWRvX2ludGVybm8qcHJlY2lvX2NydWRvX21kb2ludCp0Y2MsDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19icmVudCA9IHByb2RfbWRvX2ludGVybm8qYnJlbnQqdGNwIC0gcHJvZF9tZG9faW50ZXJubypwcmVjaW9fY3J1ZG9fbWRvaW50KnRjYywNCiAgICAgICAgICMgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbiA9IHByb2RfbWRvX2ludGVybm8gKnByZWNpb19jcnVkb19tZG9pbnQodGNwL3RjYy0xKSwNCiAgICAgICAgIHVuaWRhZF9wcmVjaW8gPSAiVVNEIiwgdW5pZGFkX3JlbnRhID0gIlBlc29zIGNvcnJpZW50ZXMiKSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWRfY2FudGlkYWQ9IHVuaWRhZCAsIHByb2RfY3J1ZG8sIGV4cG9fY3J1ZG8sIGV4aXN0ZW5jaWFzX2NydWRvLCBwcm9kX21kb19pbnRlcm5vLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2ludGVybm9fY3J1ZG8gPSBwcmVjaW9fY3J1ZG9fbWRvaW50LCBwcmVjaW9fZXh0ZXJub19jcnVkbyA9IHByZWNpb19tZV9jcnVkbywNCiAgICAgICAgICB0Y2MsIHRjcCwgdW5pZGFkX3JlbnRhLCANCiAgICAgICAgICMgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbl9jcnVkbyA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb24sDQogICAgICAgICByZW50YV9kaWZfcHJlY2lvc19jcnVkbywgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQpIA0KDQoNCg0KDQpncmFmX2RpZl9jcnVkbyA8LSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUNCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8vaXBjXzE4LA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudC9pcGNfMTgpICU+JSANCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgc2VsZWN0KGFuaW8sIDEyOm5jb2woLikgKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDM6NCkgJT4lIA0KICBtdXRhdGUodmFsb3IgPSB2YWxvciAvIDEwXjYpICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCB2YWxvciwgY29sb3IgPSB0aXBvX3JlbnRhLCBmaWxsID0gdGlwb19yZW50YSkpKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgcGV0cm9sZXJhIHBvciBkaWZlcmVuY2lhbCBkZSBwcmVjaW9zIGludGVybm8geSBleHRlcm5vIiwNCiAgICAgICB5ID0gIk1NIGRlIHBlc29zIGRlIDIwMTgiKQ0KZ3JhZl9kaWZfY3J1ZG8NCg0KDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyA8LSBwcm9kX21lcmdlX2dhc19NTUJUVSAlPiUgDQogIHNlbGVjdChhbmlvLCB1bmlkYWQsIHByb2RfZ2FzKSAlPiUgDQogIGxlZnRfam9pbihleHBvX3FfZ2FzX01NQlRVICU+JSBzZWxlY3QoYW5pbywgdW5pZGFkLCBleHBvX2dhcykpICU+JSANCiAgbXV0YXRlKGV4cG9fZ2FzID0gcmVwbGFjZV9uYShleHBvX2dhcywgMCApLA0KICAgICAgICBwcm9kX21kb19pbnRlcm5vID0gcHJvZF9nYXMgLSBleHBvX2dhcykgJT4lDQogIGxlZnRfam9pbihwcmVjaW9fbWlfZ2FzX01NQlRVICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbyAsIHByZWNpb19pbnRlcm5vX2dhcyA9ICBwcmVjaW9fZ2FzX21kb2ludCksDQogICAgICAgICAgICBieSA9ICJhbmlvIikgJT4lICAjIHVubyBjb24gcHJlY2lvIGludGVybm8NCiAgbGVmdF9qb2luKHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHByZWNpb19leHRlcm5vX2dhcyksIA0KICAgICAgICAgICAgYnkgPSAiYW5pbyIpICU+JSAgICMgdW5vIGNvbiBwcmVjaW8gZXh0ZXJubw0KICBsZWZ0X2pvaW4odGNwX2FudWFsX2IsIGJ5ID0gImFuaW8iKSAlPiUNCiAgbXV0YXRlKA0KICAgIHByZWNpb19pbnRlcm5vX2dhcyA9IHByZWNpb19pbnRlcm5vX2dhcy8gdGNjLA0KICAgIHJlbnRhX2RpZl9wcmVjaW9zX2dhcyA9IHByb2RfbWRvX2ludGVybm8gKiB0Y3AgKiBwcmVjaW9fZXh0ZXJub19nYXMNCiAgICAgIC0gcHJvZF9tZG9faW50ZXJubyAqIHRjYyAqIHByZWNpb19pbnRlcm5vX2dhcyAsDQogICAgcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbiA9IHByb2RfbWRvX2ludGVybm8gKiBwcmVjaW9faW50ZXJub19nYXMqKHRjcC90Y2MtMSksDQogICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkX2NhbnRpZGFkPSB1bmlkYWQgLCBwcm9kX2dhcywgZXhwb19nYXMsIHByb2RfbWRvX2ludGVybm8sIA0KICAgICAgICAgdW5pZGFkX3ByZWNpbywgcHJlY2lvX2ludGVybm9fZ2FzLCBwcmVjaW9fZXh0ZXJub19nYXMsIHRjYywgdGNwLA0KICAgICAgICAgdW5pZGFkX3JlbnRhLCByZW50YV9kaWZfcHJlY2lvc19nYXMsIHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzID0gcmVudGFfYWJhcmF0YW1pZW50b19zb2JyZXZhbHVhY2lvbiApDQpyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcw0KDQoNCg0KZ3JhZl9kaWZfZ2FzIDwtIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKHJlbnRhX2RpZl9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcy9pcGNfMTgsDQogICAgICAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcyA9IA0KICAgICAgICAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcy9pcGNfMTgpICU+JQ0KICAgIHNlbGVjdChhbmlvLCAxMTpuY29sKC4pICkgJT4lIA0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAzOjQpICU+JSANCiAgbXV0YXRlKHZhbG9yID0gdmFsb3IgLyAxMF42KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGdhc8OtZmVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyIsDQogICAgICAgeSA9ICJNTSBkZSBwZXNvcyBkZSAyMDE4IikrDQogIHhsaW0oMTk2MCwgMjAyMSkNCmdyYWZfZGlmX2dhcw0KDQoNCg0KYGBgDQoNCiMgUmVudGEgYXByb3BpYWRhIHBvciBzb2JyZXZhbHVhY2nDs24gY2FtYmlhcmlhDQoNCg0KJCRSc29icmV2YWx1YWNpb24gPSBFeHBvICogUGV4dCAqIChUQ1AgLSBUQ0MpJCQgDQoNCkRvbmRlOg0KKiAkUnNvYnJldmFsdWFjaW9uJCA9IFJlbnRhIGFwcm9waWFkYSBwb3IgZXhwb3J0YWNpb25lcyBjb24gdGlwbyBkZSBjYW1iaW8gc29icmV2YWx1YWRvDQoqICRFeHBvJCA9IEV4cG9ydGFjaW9uZXMgIChiYXJyaWxlcyBkZSBwZXRyw7NsZW8gw7MgTU1CVFUpDQoqICRQZXh0JCA9IFByZWNpbyBkZSByZWZlcmVuY2lhIGRlbCBtZXJjYWRvIGV4dGVybm8gKFVTRCkNCiogJFRDUCQgPSBUaXBvIGRlIENhbWJpbyBkZSBQYXJpZGFkDQoqICRUQ0MkID0gVGlwbyBkZSBDYW1iaW8gQ29tZXJjaWFsDQoNCmBgYHtyIGVjaG89RkFMU0V9DQoNCnJlbnRhX3RjcF9jcnVkbyA8LSAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gJT4lDQogIGxlZnRfam9pbihleHBvX3VzZF9jcnVkbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBleHBvX2NydWRvX3VzZCA9IGV4cG9fY3J1ZG8sIHVuaWRhZF9leHBvID0gdW5pZGFkICkpICU+JSANCiAgIG11dGF0ZShyZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyA9IGV4cG9fY3J1ZG8qcHJlY2lvX2V4dGVybm9fY3J1ZG8qdGNwIC0gZXhwb19jcnVkbypwcmVjaW9fZXh0ZXJub19jcnVkbyp0Y2MsDQogICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG9fdmFsb3IgPSBleHBvX2NydWRvX3VzZCogdGNwIC0gZXhwb19jcnVkb191c2QqIHRjYywgDQogICAgICAgICB1bmlkYWRfcHJlY2lvID0gIlVTRCIsIHVuaWRhZF9yZW50YSA9ICJQZXNvcyBjb3JyaWVudGVzIiwNCiAgICAgICAgIGRpZiA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvL3JlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvX3ZhbG9yLTEpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZCAsIGV4cG9fY3J1ZG8sDQogICAgICAgICB1bmlkYWRfZXhwbywgZXhwb19jcnVkb191c2QsDQogICAgICAgICB1bmlkYWRfcHJlY2lvLCBwcmVjaW9fZXh0ZXJub19jcnVkbyAsDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvLCByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkb192YWxvciwgZGlmKSAgDQpyZW50YV90Y3BfY3J1ZG8NCg0KcmVudGFfdGNwX2dhcyA8LSAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIA0KICAgbXV0YXRlKHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyA9IGV4cG9fZ2FzKnByZWNpb19leHRlcm5vX2dhcyp0Y3AgLSBleHBvX2dhcypwcmVjaW9fZXh0ZXJub19nYXMqdGNjLA0KICAgICAgICAgdW5pZGFkX3ByZWNpbyA9ICJVU0QiLCB1bmlkYWRfcmVudGEgPSAiUGVzb3MgY29ycmllbnRlcyIpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9jYW50aWRhZCAsIGV4cG9fZ2FzLCANCiAgICAgICAgIHVuaWRhZF9wcmVjaW8sIHByZWNpb19leHRlcm5vX2dhcyAsDQogICAgICAgICAgdGNjLCB0Y3AsIHVuaWRhZF9yZW50YSwNCiAgICAgICAgIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcykgIA0KDQoNCg0KYGBgDQoNCg0KDQojIFJlbnRhIGFwcm9waWFkYSBwb3IgZWwgRXN0YWRvIG1lZGlhbnRlIGltcHVlc3RvcyBlc3BlY8OtZmljb3MNCg0KYGBge3IgZWNobz1GQUxTRX0NCg0KcmV0ZW5jaW9uZXNfY2FtcG9kb25pY28gPC0gcmVhZF9leGNlbCgiL0FyY2hpdm9zL0RhdG9zL0hpZHJvY2FyYnVyb3MvRXN0aW1hY2lvbiBwcm9waWEvZGF0YXNldHMvcmV0ZW5jaW9uZXMueGxzeCIgLCANCiAgICBzaGVldCA9ICJ1c2QiKSAlPiUgDQogIGxlZnRfam9pbih0Y3BfYW51YWwgJT4lIHNlbGVjdCgtVENQKSkgJT4lIA0KICBtdXRhdGUocmV0ZW5jaW9uZXNfaGMgPSByZXRlbmNpb25lc19oZyAqIFRDQyAqIDEwMDAwMDAsDQogICAgICAgICB1bmlkYWQgPSAiYXJzIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCByZXRlbmNpb25lc19oYykNCg0KcmV0ZW5jaW9uZXNfY3J1ZG8gPC0gcmVhZF9leGNlbCggIi9BcmNoaXZvcy9EYXRvcy9IaWRyb2NhcmJ1cm9zL0VzdGltYWNpb24gcHJvcGlhL2RhdGFzZXRzL3JldGVuY2lvbmVzLnhsc3giICkgJT4lDQogIHJlbmFtZShyZXRlbmNpb25lc19jcnVkb19qayA9IHJldGVuY2lvbmVzX2prLA0KICAgICAgICAgcmV0ZW5jaW9uZXNfY3J1ZG9fYmZyID0gInJldGVuY2lvbmVzX2Jmcl9NJDIwMDgiKSAlPiUgDQogIG11dGF0ZShyZXRlbmNpb25lc19jcnVkb19iZnIgPSByZXRlbmNpb25lc19jcnVkb19iZnIgKiBpcGMwOF9iZnIgKiAxMDAwICwNCiAgICAgICAgIHVuaWRhZCA9ICJhcnMiKSAlPiUgDQogIHNlbGVjdCgtaXBjMDhfYmZyKSAlPiUgDQogIGxlZnRfam9pbihyZXRlbmNpb25lc19jYW1wb2RvbmljbykNCg0KDQpyZW50ZW5jaW9uZXNfcmVnYWxpYXMgPC0gcmVnYWxpYXMgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQpICU+JSANCiAgc3VtbWFyaXNlKHJlZ2FsaWFzX3RvdGFsID0gc3VtKHJlZ2FsaWFzX3RvdGFsLCBuYS5ybSA9IFQpKSAlPiUgDQogIGxlZnRfam9pbihyZXRlbmNpb25lc19jcnVkbyAlPiUgc2VsZWN0KC1jKHJldGVuY2lvbmVzX2NydWRvX2JmciwgcmV0ZW5jaW9uZXNfaGMpKSkgDQoNCg0KDQpyZXRlbmNpb25lc19jcnVkbw0KDQoNCmBgYA0KDQoNCg0KDQokJFJpbXAgPSBSRSArIFJlZyQkDQoNCkRvbmRlOg0KDQoqICRSaW1wJCA9IFJlbnRhIGFwcm9waWFkYSBwb3IgZWwgRXN0YWRvIG1lZGlhbnRlIGltcHVlc3RvcyBlc3BlY8OtZmljb3MNCiogJFJFJCA9IFJldGVuY2lvbmVzDQoqICRSZWckID0gUmVnYWxpYXMNCg0KIyBSZW50YSBhcHJvcGlhZGEgcG9yIGNvbnN1bWlkb3JlcyB5IHJlZmluZXLDrWFzIHkgcHJvY2VzYWRvcmFzDQoNCiMjIyBDcml0ZXJpbyBkZSBjw7NtcHV0byBkZSBSYW3Ds24gKDIwMTkpDQoNCiMjIyMgUmVmaW5lcsOtYXMgeSBwcm9jZXNhZG9yYXMNCg0KJCRSUiA9IChQSSAtIFBSTWkpICogQ3J1ZG9QJCQNCg0KDQoNCiogJFJSJCA9IFJlbnRhIGFwcm9waWFkYSBwb3IgbGFzIFJlZmluYWRvcmFzIA0KKiAkUEkkID0gcHJvbWVkaW8gcG9uZGVyYWRvIGRlIFByZWNpb3MgSW50ZXJuYWNpb25hbGVzIA0KKiAkUFJNaSQgPSBQcmVjaW8gcG9uZGVyYWRvIGEgUmVmaW5lcsOtYXMgZGVsIE1lcmNhZG8gSW50ZXJubw0KKiAkQ3J1ZG9QJCA9IGJhcnJpbGVzIGRlIENydWRvIFByb2Nlc2FkbyBwb3IgbGFzIHJlZmluYWRvcmFzDQoNCiMjIyMgQ29uc3VtaWRvcmVzDQoNCiQkUkMgPSAoUEkgLSBQUk1pIC0gTVIpICogQ3J1ZG9QICQkDQoNCiogJFJDJCA9IFJlbnRhIGFwcm9waWFkYSBwb3IgbG9zIENvbnN1bWlkb3Jlcw0KKiAkTVIkID0gTWFyZ2VuIGRlIFJlZmluZXLDrWFzDQoNCkVzdG8gcmVzdWx0YSBlcXVpdmFsZW50ZSBhIHBsYW50ZWFyOg0KDQokJFJDID0gUENNaSAqIENydWRvUCQkDQoNCiogJFBDTWkkID0gUHJlY2lvIHBvbmRlcmFkbyBhIENvbnN1bWlkb3JlcyBkZWwgTWVyY2FkbyBJbnRlcm5vLg0KDQoNCg0KDQojIFJlbnRhIEhpZHJvY2FyYnVyw61mZXJhIFRvdGFsLiBFbiBwcmVjaW9zIGNvbnN0YW50ZXMsIHNvYnJlIFBsdXN2YWzDrWEgVG90YWwgeSBQQkkNCg0KRXhpc3RlbiBkb3MgY2FtaW5vcyBwYXJhIGxsZWdhciBhbCBtb250byB0b3RhbCBkZSByZW50YSBkZSBsYSB0aWVycmEgaGlkcm9jYXJidXLDrWZlcmE6IHVubyBlcyBkZXNjb250YW5kbyBsYSBnYW5hbmNpYSBub3JtYWwgZGUgbGFzIGVtcHJlc2FzIGEgbGEgcGx1c3ZhbMOtYSB0b3RhbCBkZWwgc2VjdG9yIHkgZWwgb3RybyBlcyBwb3IgbWVkaW8gZGUgbGEgc3VtYSBkZSBtZWNhbmlzbW9zIGRlIGFwcm9waWFjacOzbi4NCg0KJCRSZW50YVxfaGlkcm9jYXJidXLDrWZlcmEgPSBQVl97aGlkcm9jYXJidXLDrWZlcmF9IC0gR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0kJA0KRG9uZGU6DQoNCiogJEdjaWFcX05vcm1hbF97aGlkcm9jYXJidXLDrWZlcmF9JCA9IEdhbmFuY2lhIE5vcm1hbCBkZWwgc2VjdG9yIGhpZHJvY2FyYnVyw61mZXJvDQoqICRQVl97aGlkcm9jYXJidXLDrWZlcmF9JCA9IFBsdXN2YWzDrWEgZGVsIHNlY3RvciBoaWRyb2NhcmJ1csOtZmVybyAgDQoNCiQkR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0gPSBLVEFfe2hpZHJvY2FyYnVyw61mZXJvfSAqIFRHX3tyZWZlcmVuY2lhfSQkDQoNCg0KRG9uZGU6DQoNCiogJEtUQV97aGlkcm9jYXJidXJvc30kID0gU3RvY2sgZGUgY2FwaXRhbCBhZGVsYW50YWRvIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8gDQoqICRUR197cmVmZXJlbmNpYX0kID0gVGFzYSBkZSBnYW5hbmNpYSBub3JtYWwgZGUgcmVmZXJlbmNpYS4NCg0KRW4gZXN0ZSBjYXNvLCBzZWxlY2Npb25hbW9zIGxhIHRhc2EgZGUgZ2FuYW5jaWEgZGVsIHNlY3RvciBpbmR1c3RyaWFsIGNvbW8gcGFyw6FtZXRybyBwYXJhIGRpZmVyZW5jaWFyIGxhIHJlbnRhIGRlIGxhIGdhbmFuY2lhLiBBIHN1IHZleiwgcGFyYSBlbCBjYXBpdGFsIHRvdGFsIGFkZWxhbnRhZG8gZGUgbGFzIGVtcHJlc2FzIGhpZHJvY2FyYnVyw61mZXJhcywgc2VsZWNjaW9uYW1vcyB1bmljYW1lbnRlIGVsIHZhbG9yIHJlc3VsdGFudGUgZGUgbGEgZXN0aW1hY2nDs24gZGUgbGEgUFB5RSBkZSBCb2xzYXIgYSBwYXJ0aXIgZGVsIGluZGljZSBkZSBmbHVqbyBkZSBwb3pvcyAodmFyaWFibGUgInBweWVfYm9sc2FyX2ZsdWpvIiksIHBvciBsbyBxdWUgbGUgZmFsdGFuIGxvcyBpbnZlbnRhcmlvcyB5IHNhbGFyaW9zIGFkZWxhbnRhZG9zLg0KDQpFbCBjw6FsY3VsbyBkZSByZW50YSB0b3RhbCBoaWRyb2NhcmJ1csOtZmVyYSBxdWUgc2Ugb2J0aWVuZSBwb3IgbWVkaW8gZGUgZGVzY29udGFyIGxhIGdhbmFuY2lhIG5vcm1hbCBhIGxhIHBsdXN2YWzDrWEgdG90YWwgZGVsIHNlY3RvciwgZGViZSBzZXIgaWd1YWwgYSBsYSByZW50YSBvYnRlbmlkYSBwb3IgbWVkaW8gZGUgbGEgYWdyZWdhY2nDs24gZGUgbG9zIGRpc3RpbnRvcyBtZWNhbmlzbW9zIGRlIGFwcm9waWFjacOzbi4gRXMgZGVjaXI6DQoNCiQkUmVudGFcX2hpZHJvY2FyYnVyw61mZXJhID0gUmVudGFcX2RpZmVyZW5jaWFsXF9wcmVjaW9zICsgUmVudGFcX3NvYnJldmFsdWFjacOzbiArIFJlbnRhXF9lbXByZXNhcyArIEltcHVlc3Rvc1xfbmV0b3NcX2VzcGVjw61maWNvcyAkJA0KJCRJbXB1ZXN0b3NcX25ldG9zXF9lc3BlY8OtZmljb3MgPSBSZXRlbmNpb25lcyArIFJlZ2Fsw61hcyAtIFN1YnNpZGlvcyQkDQoNCiMjIE3DqXRvZG8gZGlyZWN0byAoYSBwYXJ0aXIgZGUgZGVzY3VlbnRvcyBzb2JyZSBlbCBWQlApDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvPSBUUlVFLGZpZy53aWR0aCA9IDEyMCxmaWcuaGVpZ2h0ID0gNDAwKQ0KcmVudGFfZGlyZWN0byA8LSByZW50YV90ZyAlPiUgDQogIHNlbGVjdChhbmlvLCBwcHllICwgI2VzIHN0b2NrIGRlIGJvbHNhcg0KICAgICAgICAgdGdfaGlkcm9jYXJidXJvcywgdGdfbm9ybWFsID0gdW5pb25fdGcpICU+JSANCiAgbGVmdF9qb2luKGNyaXRlcmlvX3Byb3BpbyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCAgcHYpICklPiUgDQogIGxlZnRfam9pbihzdWJzaWRpb3NfaGlkcm9jYXJidXJvcyAlPiUgDQogICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCBieSA9ImFuaW8iKSAlPiUNCiAgICAgICAgICAgICAgbXV0YXRlKHN1YnNpZGlvcyA9IChzdWJzaWRpb3NfZWplcy8xMF42KS9pcGNfMTgsIA0KICAgICAgICAgICAgICAgICAgICAgc3Vic2lkaW9zID1yZXBsYWNlX25hKHN1YnNpZGlvcywgMCkgKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhbmlvLCBzdWJzaWRpb3MpKSAlPiUgDQogIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpLCBieSA9ImFuaW8iKSAlPiUgDQogIG11dGF0ZShyZW50YV9jb25fdGdfbm9ybWFsID0gcHB5ZSogKHRnX2hpZHJvY2FyYnVyb3MgLSB0Z19ub3JtYWwpLA0KICAgICAgICAgZ2NpYV9ub3JtYWxfaGlkcm9jYXJidXJvcyA9IHBweWUgKiB0Z19ub3JtYWwsDQogICAgICAgICByZW50YV90b3RhbCA9IChwdi9pcGNfMTgpIC0gZ2NpYV9ub3JtYWxfaGlkcm9jYXJidXJvcyAtc3Vic2lkaW9zLA0KICAgICAgICAgIyBwcm9wb3JjaW9uX3N1YnNpZGlvcyA9IHN1YnNpZGlvcy8NCiAgICAgICAgICMgICAocHYgLSBnY2lhX25vcm1hbF9oaWRyb2NhcmJ1cm9zKSwNCiAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBwZXNvcyBkZSAyMDE4IikgJT4lIA0KICBzZWxlY3QoYW5pbyAsIGlwY18xOCwgdW5pZGFkLCBldmVyeXRoaW5nKC4pLCAtcmVudGFfY29uX3RnX25vcm1hbCkgJT4lICNzYWNvIHJlbnRhX2Nvbl90Z19ub3JtYWwgcG9yIG5vIHVzbw0KICBmaWx0ZXIoYW5pbyA+MTk5NykNCnJlbnRhX2RpcmVjdG8NCg0KcmVudGFfZGlyZWN0byAlPiUNCiAgZmlsdGVyKGFuaW8gPjE5NjApICU+JSANCiAgZ2dwbG90KGFlcyhhbmlvLCByZW50YV90b3RhbCkpKyANCiAgZ2VvbV9saW5lKCkrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgdG90YWwgYSBwYXJ0aXIgZGUgZXN0aW1hY2nDs24gcHJvcGlhIGRlbCBWQlAiLA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgZGUgMjAxOCIpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkNCg0KDQoNCnJlbnRhX2RpcmVjdG9fcGJpIDwtIHJlbnRhX2RpcmVjdG8gJT4lIA0KICBsZWZ0X2pvaW4oZ2FuYW5jaWFfeV9wYmkgJT4lIHJlbmFtZSh1bmlkYWRfcGJpX2djaWEgPSB1bmlkYWQpLCAgYnkgPSAiYW5pbyIpICU+JSANCiAgIyBsZWZ0X2pvaW4oaXBjX3Byb21lZGlvICU+JSBzZWxlY3QoYW5pbywgaXBjXzE4KSwgIGJ5ID0gImFuaW8iKSAlPiUgDQogIG11dGF0ZShyZW50YV9wdiA9KHJlbnRhX3RvdGFsKmlwY18xOCApL2dhbmFuY2lhLCANCiAgICAgICAgIHJlbnRhX3BiaSA9KHJlbnRhX3RvdGFsKmlwY18xOCApL3BiaSApDQoNCg0KZ3JhZl9yZW50YV9kaXJlY3RvX3BiaSA8LSByZW50YV9kaXJlY3RvX3BiaSAlPiUgDQogIHNlbGVjdChhbmlvLCByZW50YV9wdixyZW50YV9wYmkgKSAlPiUNCiAgIyBmaWx0ZXIoYW5pbyA+PSAxOTYyLCBmdWVudGVfZ2NpYSA9PSAiUHJvcGlhIikgJT4lDQogIGZpbHRlcihhbmlvID49IDE5NjIpICU+JQ0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjMpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yKSkrDQogICMgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsNCiAgZ2VvbV9saW5lKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIHNvYnJlIFBCSSB5IEdhbmFuY2lhcyBUb3RhbGVzIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJBIHBhcnRpciBkZSBlc3RpbWFjacOzbiBwcm9waWEgZGVsIFZCUCIsDQogICAgICAgeSA9ICIlIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDIpKSsNCiAgZmFjZXRfZ3JpZCh+dGlwb19yZW50YSApDQoNCiMgZ3JhZl9yZW50YV9kaXJlY3RvX3BiaQ0KZ2dwbG90bHkoZ3JhZl9yZW50YV9kaXJlY3RvX3BiaSwgaGVpZ2h0ID0gNDAwLCB3aWR0aCA9IDYwMCkNCg0KYGBgDQoNCg0KIyMgTcOpdG9kbyBpbmRpcmVjdG8gKHN1bWEgZGUgbWVjYW5pc21vcykNCg0KYGBge3IgZWNobz1GQUxTRX0NCnJlbnRhX2luZGlyZWN0byA8LSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAlPiUgDQogICMgc2VsZWN0KGFuaW8scmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8sIHJlbnRhX2RpZl9wcmVjaW9zX2JyZW50ICkgJT4lDQogIHNlbGVjdChhbmlvLHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICkgJT4lDQogIGxlZnRfam9pbihyZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyAlPiUgc2VsZWN0KGFuaW8sIHJlbnRhX2RpZl9wcmVjaW9zX2dhcykgKSAlPiUgDQogIGxlZnRfam9pbihyZW50ZW5jaW9uZXNfcmVnYWxpYXMgJT4lIHNlbGVjdCgtdW5pZGFkKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShyZXRlbmNpb25lcyA9IHJldGVuY2lvbmVzX2NydWRvX2prKSkgJT4lIA0KICBsZWZ0X2pvaW4ocmVudGFfdGNwX2NydWRvICU+JSBzZWxlY3QoYW5pbywgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8pKSAlPiUgDQogIGxlZnRfam9pbihyZW50YV90Y3BfZ2FzICU+JSBzZWxlY3QoYW5pbywgcmVudGFfc29icmV2YWx1YWNpb25fZ2FzKSkgJT4lIA0KICAgbGVmdF9qb2luKHN1YnNpZGlvc19oaWRyb2NhcmJ1cm9zICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgIHN1YnNpZGlvcyA9IHN1YnNpZGlvc19lamVzKSwgYnkgPSJhbmlvIikgJT4lIA0KICBncm91cF9ieShhbmlvICkgJT4lIA0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHt4IC8gMTBeNn0pICU+JSAjbGFzIHZibGVzIGNhcmdhZGFzIGFudGVyaW9ybWVudGUgc2UgcGFzYW4gYSBNTQ0KICBtdXRhdGVfYWxsKGZ1bmN0aW9uKHgpIHJlcGxhY2VfbmEoeCwgMCkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbGVmdF9qb2luKHJlbnRhX3RnICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKHN0b2NrX3NlbGVjY2lvbmFkbyA9PSAiQm9sc2FyIikgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgcmVudGFfZW1wcmVzYXMgPSByZW50YV9jb25fdGdfdW5pb24pICkgJT4lDQogICMgbGVmdF9qb2luKHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgJT4lIHNlbGVjdChhbmlvLCByZW50YV9lbXByZXNhcykpICU+JQ0KICAjIGxlZnRfam9pbihyZW50YV9kaXJlY3RvICU+JQ0KICAjICAgICAgICAgICAgIGZpbHRlcihzdG9ja19zZWxlY2Npb25hZG8gPT0gInBweWVfYm9sc2FyIikgJT4lDQogICMgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIHJlbnRhX2VtcHJlc2FzID0gcmVudGFfY29uX3RnX25vcm1hbCkgJT4lIA0KICAjICAgICAgICAgICAgIG11dGF0ZShyZW50YV9lbXByZXNhcyA9IDApKSAlPiUNCiAgbGVmdF9qb2luKHRjcF9hbnVhbF9iKSAlPiUgDQogIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSAlPiUgcmVuYW1lKHVuaWRhZF9wYmlfZ2NpYSA9IHVuaWRhZCkpICU+JSANCiAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgbXV0YXRlKA0KICAgIHJlbnRhX2RpZl9wcmVjaW9zX2dhcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcyAvaXBjXzE4LA0KICAgICAgICAgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZfcHJlY2lvc19jcnVkbyAvIGlwY18xOCwNCiAgICAgICAgICMgcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQgPSByZW50YV9kaWZfcHJlY2lvc19icmVudCAvaXBjXzE4LA0KICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gPSByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkby9pcGNfMTgsDQogICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgPSByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMvaXBjXzE4LA0KICAgICAgICAgcmVnYWxpYXNfdG90YWwgPSByZWdhbGlhc190b3RhbCAvIGlwY18xOCwNCiAgICAgICAgIHJldGVuY2lvbmVzID0gcmV0ZW5jaW9uZXMgLyBpcGNfMTgsIA0KICAgICAgICAgc3Vic2lkaW9zID0gc3Vic2lkaW9zL2lwY18xOCwNCiAgICByZW50YV9lbXByZXNhcyA9cmVwbGFjZV9uYShyZW50YV9lbXByZXNhcywgIDApLA0KICAgICAgICAgcmVudGFfZW1wcmVzYXMgPSByZW50YV9lbXByZXNhcy9pcGNfMTgsDQogICAgICAgICByZW50YV90b3RhbCA9IHJlbnRhX2RpZl9wcmVjaW9zX2dhcysgcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8gKw0KICAgICAgICAgICByZW50YV9zb2JyZXZhbHVhY2lvbl9jcnVkbyArIHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcyArDQogICAgICAgICAgIHJlbnRhX2VtcHJlc2FzKw0KICAgICAgICAgICByZWdhbGlhc190b3RhbCArICByZXRlbmNpb25lcyAtIHN1YnNpZGlvcywNCiAgICAgICAgIHByb3BvcmNpb25fc3Vic2lkaW9zID0gc3Vic2lkaW9zLyhyZW50YV9kaWZfcHJlY2lvc19nYXMrIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvICsNCiAgICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb25fY3J1ZG8gKyByZW50YV9zb2JyZXZhbHVhY2lvbl9nYXMgKw0KICAgICAgICAgICByZWdhbGlhc190b3RhbCArICByZXRlbmNpb25lcykgICwNCiAgICAgICAgIHJlbnRhX3B2ID0gKHJlbnRhX3RvdGFsKmlwY18xOCkvZ2FuYW5jaWEsDQogICAgICAgICByZW50YV9wYmkgPSAocmVudGFfdG90YWwqaXBjXzE4KS9wYmksDQogICAgICAgICB1bmlkYWQgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIsDQogICAgICAgICByZW50YV91c2RfdGNjID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y2MsIA0KICAgICAgICAgcmVudGFfdXNkX3RjcCA9IChyZW50YV90b3RhbCppcGNfMTgpIC8gdGNwLCkgICU+JSANCiAgcmVuYW1lKHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzID0gcmVudGFfZGlmX3ByZWNpb3NfZ2FzLA0KICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvLA0KICAgICAgICAgIyByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2JyZW50ID0gcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQsDQogICAgICAgICByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2NydWRvICwNCiAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcyA9IHJlbnRhX3NvYnJldmFsdWFjaW9uX2dhcywpICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZCwgaXBjXzE4LHRjYyx0Y3AsIGV2ZXJ5dGhpbmcoLikgLCAtc29icmV2YWx1YWNpb24pICU+JSANCiAgIyBzZWxlY3QoLXJlbnRhX2RpZl9wcmVjaW9zX2NydWRvKQ0KICAjIHNlbGVjdCgtcmVudGFfZGlmX3ByZWNpb3NfYnJlbnQpICU+JSANCiAgZGlzdGluY3QoKQ0KDQoNCiNSZW50YSB0b3RhbA0KZ3JhZl9yZW50YV90b3RhbCA8LSByZW50YV9pbmRpcmVjdG8gJT4lDQogIGZpbHRlcihhbmlvID4xOTYwKSAlPiUgDQogIHNlbGVjdCgtYyh1bmlkYWQsIGlwY18xOCwgcmVudGFfdG90YWwsIHRjYywgdGNwLA0KICAgICAgICAgICAgc3Vic2lkaW9zLCBwcm9wb3JjaW9uX3N1YnNpZGlvcykpICU+JSANCiAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQogICAgICAgICB2YWx1ZSA9IHZhbG9yLA0KICAgICAgICAgMjo4KSAlPiUgDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAic3RhY2siKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiQ3Vyc29zIGRlIGFwcm9waWFjacOzbi4gTWlsbG9uZXMgcGVzb3MgZGUgMjAxOCIsIA0KICAgICAgIHkgPSAiTWlsbG9uZXMgZGUgcGVzb3MgMjAxOCIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkrDQogIHRoZW1lX2NsYXNzaWMoKQ0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQojIHByb3BvcmNpb24gc3Vic2lkaW9zDQojIHJlbnRhX2luZGlyZWN0b1ssYygiYW5pbyIsInByb3BvcmNpb25fc3Vic2lkaW9zIildICU+JSBhcnJhbmdlKC1hbmlvKQ0KYGBgDQoNCg0KYGBge3IgZWNobz1GQUxTRX0NCiNSZW50YSB0Y3AgeSB0Y2MNCmdyYWZfcmVudGFfdG90YWxfdXNkIDwtIHJlbnRhX2luZGlyZWN0byAlPiUgDQogIHNlbGVjdChjKGFuaW8sIHJlbnRhX3VzZF90Y2MsIHJlbnRhX3VzZF90Y3ApKSAlPiUNCiAgZmlsdGVyKGFuaW8gPiAxOTYyKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDI6MykgJT4lDQogIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSkgKSsNCiAgZ2VvbV9saW5lKCkrDQogIGdlb21fcG9pbnQoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KICBsYWJzKHRpdGxlID0gIlJlbnRhIGhpZHJvY2FyYnVyw61mZXJhIHRvdGFsIChwZXRyw7NsZW8geSBnYXMpIiwgDQogICAgICAgc3VidGl0bGUgPSAiTWlsbG9uZXMgZGUgVVNEIiwgDQogICAgICAgeSA9ICJNaWxsb25lcyBkZSBVU0QiKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKHgpIGZvcm1hdCh4LCBiaWcubWFyayA9ICIuIiwgc2NpZW50aWZpYyA9IEZBTFNFKSkNCmdncGxvdGx5KGdyYWZfcmVudGFfdG90YWxfdXNkLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KDQoNCg0KDQojY29tcGFyYWNpb24gY29uIEZSDQpncmFmX2NvbXBhcmFjaW9uX3JlbnRhcyA8LSByZW50YV9pbmRpcmVjdG8gJT4lIA0KICBtdXRhdGUoZnVlbnRlID0gIlByb3BpYSB2aWEgc3VtYSBkZSBtZWNhbmlzbW9zIikgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLGZ1ZW50ZSwgIHJlbnRhX3RvdGFsICkgJT4lIA0KICBiaW5kX3Jvd3MocmVudGFfZGlyZWN0b19wYmkgJT4lIA0KICAgICAgICAgICAgICAgIG11dGF0ZShmdWVudGUgPSAiUHJvcGlhIHZpYSBkZXNjdWVudG9zIHNvYnJlIFZCUCIpICU+JSANCiAgICAgICAgICAgICAgIHNlbGVjdChhbmlvLGZ1ZW50ZSwgIHJlbnRhX3RvdGFsICkgKSAlPiUgDQogIGJpbmRfcm93cyhyZW50YV9oaWRyb2NhcmJ1cm9zX2ZyICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKGZ1ZW50ZSA9ICJGw6FyZmFybyBSdWl6IHkgQmlsbCIpICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBmdWVudGUsICByZW50YV90b3RhbCkpICU+JSANCiAgZmlsdGVyKGFuaW8gPj0gMTk2MikgJT4lDQogIGdncGxvdChhZXMoYW5pbywgcmVudGFfdG90YWwsIGNvbG9yID0gZnVlbnRlKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC4zNSkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbXBhcmFjacOzbiBkZSBlc3RpbWFjaW9uZXMuIE1pbGxvbmVzIHBlc29zIGRlIDIwMTgiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIHBlc29zIDIwMTgiKSsNCiAgdGhlbWVfY2xhc3NpYygpDQpncmFmX2NvbXBhcmFjaW9uX3JlbnRhcw0KDQoNCiNzb2JyZSBwYmkgeSBwdg0KZ3JhZl9yZW50YV90b3RhbF9wdiA8LSByZW50YV9pbmRpcmVjdG8gJT4lIA0KICBzZWxlY3QoYW5pbywgcmVudGFfcHYscmVudGFfcGJpICkgJT4lDQogIGZpbHRlcihhbmlvID49IDE5NjIpICU+JQ0KICBnYXRoZXIoa2V5ID0gdGlwb19yZW50YSwNCiAgICAgICAgIHZhbHVlID0gdmFsb3IsDQogICAgICAgICAyOjMpICU+JQ0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IHRpcG9fcmVudGEsIGZpbGwgPSB0aXBvX3JlbnRhKSkrDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBzb2JyZSBQQkkgeSBHYW5hbmNpYXMgVG90YWxlcyIsDQogICAgICAgc3VidGl0bGUgPSAiU3VtYSBkZSBtZWNhbmlzbW9zIiwNCiAgICAgICB5ID0gIiUiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OnBlcmNlbnQpDQoNCg0KZ2dwbG90bHkoZ3JhZl9yZW50YV90b3RhbF9wdiwgd2lkdGggPSA2MDAsIGhlaWdodCA9IDQwMCkNCg0KYGBgDQoNCg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KDQoNCiNzb2xvIHJlbnRhIGVtcHJlc2FzDQojIHJlbnRhX2luZGlyZWN0byAlPiUNCiMgICBmaWx0ZXIoYW5pbyA+IDE5NjApICU+JSANCiMgICBtdXRhdGUocmVudGFfZW1wcmVzYXNfcHYgPSByZW50YV9lbXByZXNhcyppcGNfMTgvZ2FuYW5jaWEsDQojICAgICAgICAgIHJlbnRhX2VtcHJlc2FzX3BiaSA9IHJlbnRhX2VtcHJlc2FzKmlwY18xOC9wYmkpICU+JSANCiMgICBzZWxlY3QoYW5pbywgcmVudGFfZW1wcmVzYXNfcHYsIHJlbnRhX2VtcHJlc2FzX3BiaSkgJT4lIA0KIyAgIGdhdGhlcihrZXkgPSB2YXJpYWJsZSwgdmFsdWUgPSB2YWxvciwgMjozICkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGZpbGwgPSB2YXJpYWJsZSkpKw0KIyAgIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikrDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpKw0KIyAgIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEgYXByb3BpYWRhIHBvciBlbXByZXNhcyBzb2JyZSBQQkkgeSBHYW5hbmNpYXMgVG90YWxlcyIsDQojICAgICAgICB5ID0gIiUiKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudCkNCg0KICANCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMgc29sbyBnYXMNCiMgR2FzDQojIHJlbnRhX2dhc19wYmlfcHYgPC0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgJT4lIA0KIyAgIHNlbGVjdChhbmlvLHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzLCByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcyApICU+JSANCiMgICBncm91cF9ieShhbmlvICkgJT4lIA0KIyAgIG11dGF0ZV9hbGwoZnVuY3Rpb24oeCkge3ggLyAxMF42fSkgJT4lIA0KIyAgIGxlZnRfam9pbihnYW5hbmNpYV95X3BiaSkgJT4lIA0KIyAgIG11dGF0ZShyZW50YV9kaWZfcHJlY2lvc19nYXNfcHYgPSByZW50YV9kaWZfcHJlY2lvc19nYXMvZ2FuYW5jaWEsDQojICAgICAgICAgIHJlbnRhX2RpZl9wcmVjaW9zX2dhc19wYmkgPSByZW50YV9kaWZfcHJlY2lvc19nYXMvcGJpLA0KIyAgICAgICAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhc19wdiA9IHJlbnRhX2FiYXJhdGFtaWVudG9fc29icmV2YWx1YWNpb25fZ2FzL2dhbmFuY2lhLA0KIyAgICAgICAgICByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhc19wYmkgPSByZW50YV9hYmFyYXRhbWllbnRvX3NvYnJldmFsdWFjaW9uX2dhcy9wYmksDQojICAgICAgICAgIHVuaWRhZCA9ICJNaWxsb25lcyBkZSBQZXNvcyBjb3JyaWVudGVzIikNCiMgDQojIGdyYWZfcmVudGFfZ2FzX3B2IDwtIHJlbnRhX2dhc19wYmlfcHYgJT4lIA0KIyAgIHNlbGVjdChhbmlvLCA3Om5jb2woLikgKSAlPiUgDQojICAgZ2F0aGVyKGtleSA9IHRpcG9fcmVudGEsDQojICAgICAgICAgIHZhbHVlID0gdmFsb3IsDQojICAgICAgICAgIDI6bmNvbCguKSkgJT4lIA0KIyAgIGdncGxvdChhZXMoYW5pbywgdmFsb3IsIGNvbG9yID0gdGlwb19yZW50YSwgZmlsbCA9IHRpcG9fcmVudGEpKSsNCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKw0KIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiMgICBsYWJzKHRpdGxlID0gIlJlbnRhIHBldHJvbGVyYSBwb3IgZGlmZXJlbmNpYWwgZGUgcHJlY2lvcyBpbnRlcm5vIHkgZXh0ZXJubyBzb2JyZSBQQkkgeSBHYW5hbmNpYXMgVG90YWxlcyIsDQojICAgICAgICB5ID0gIiUiKQ0KIyBwbG90bHk6OmdncGxvdGx5KGdyYWZfcmVudGFfZ2FzX3B2KQ0KYGBgDQoNCiMjIENvc3Rvcw0KDQokJFFcX3RvdGFsID0gUV97cGV0csOzbGVvfSArIFFfe2dhc30gJCQNCkRvbmRlOg0KICANCiAgKiAkUVxfdG90YWwkID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIGRlIHBldHLDs2xlbyB5IGdhcyBlbiBCYXJyaWxlcyBFcXVpdmFsZW50ZXMgZGUgUGV0csOzbGVvDQogICogJFFfe3BldHLDs2xlb30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIGRlIHBldHLDs2xlbyBjcnVkbyBlbiBiYXJyaWxlcyBlcXVpdmFsZW50ZXMgZGUgcGV0csOzbGVvIChCT0UpDQogICogJFFfe2dhc30kID0gQ2FudGlkYWRlcyBwcm9kdWNpZGFzIGRlIGdhcyBuYXR1cmFsIGVuIGJhcnJpbGVzIGVxdWl2YWxlbnRlcyBkZSBwZXRyw7NsZW8gKEJPRSkNCiAgDQoNCiQkIENvc3Rvc1xfdG90YWxlcyA9ICBDSSArIE1TICsgQ29uS2Zpam8kJA0KDQpEb25kZToNCg0KKiAkQ29zdG9zXF90b3RhbGVzJCA9IENvc3RvcyB0b3RhbGVzIGhpZHJvY2FyYnVyw61mZXJvcw0KKiAkQ0kkID0gQ29uc3VtbyBJbnRlcm1lZGlvLCBkaXN0aW50YXMgZXN0aW1hY2lvbmVzDQoqICRNUyQgPSBNYXNhIFNhbGFyaWFsLCBkaXN0aW50YXMgZXN0aW1hY2lvbmVzDQoqICRDb25LZmlqbyQgPSBDb25zdW1vIGRlIENhcGl0YWwgRmlqbw0KDQoNCiQkQ29zdG9zXF90b3RhbGVzXF9jb25cX0djaWEgPSBDb3N0b3NcX3RvdGFsZXMgKyBHY2lhXF9Ob3JtYWxfe2hpZHJvY2FyYnVyw61mZXJhfSAkJA0KRG9uZGU6DQoNCiogJENvc3Rvc1xfdG90YWxlc1xfY29uXF9HY2lhJCA9IENvc3RvcyB0b3RhbGVzIGhpZHJvY2FyYnVyw61mZXJvcyBjb24gZ2FuYW5jaWEgbm9ybWFsIA0KKiAkR2NpYVxfTm9ybWFsX3toaWRyb2NhcmJ1csOtZmVyYX0kID0gR2FuYW5jaWEgbm9ybWFsIGRlbCBzZWN0b3IgaGlkcm9jYXJidXLDrWZlcm8NCg0KJCQgUHJlY2lvXF9jb3N0byA9IFxmcmFje0Nvc3Rvc1xfdG90YWxlc317UVxfdG90YWx9ICAgJCQNCkRvbmRlOg0KKiAkUHJlY2lvXF9jb3N0byQgPSBQcmVjaW8gZGUgY29zdG8gZW4gQk9FDQoNCkEgcGFydGlyIGRlIGVzdG8gc2UgcHVlZGUgY2FsY3VsYXIgdW4gY29zdG8gcmVjdXBlcmFibGUgZGVsIHBldHLDs2xlbyB5IGRlbCBnYXMNCg0KJCRDb3N0b1xfY3J1ZG8gPSBRX3twZXRyw7NsZW99ICogUHJlY2lvXF9jb3N0byQkDQokJENvc3RvXF9nYXMgPSBRX3tnYXN9ICogUHJlY2lvXF9jb3N0byQkDQoNCg0KJCRQcmVjaW9cX3Byb2R1Y2Npb24gPSBcZnJhY3tDb3N0b3NcX3RvdGFsZXNcX2NvblxfR2NpYX17UVxfdG90YWx9JCQNCg0KJCRQcmVjaW9cX3Z0YVxfcG90ZW5jaWFsID0gIFxmcmFje1FcX3RvdGFsKlBleHRfe3BldHLDs2xlb30gLSBDb3N0b3NcX3RvdGFsZXN9e1FcX3RvdGFsfSAkJA0KDQoNCkRvbmRlOg0KKiAkUHJlY2lvXF9wcm9kdWNjaW9uJD0gUHJlY2lvIGRlIHByb2R1Y2Npb24NCiogJFByZWNpb192dGFfcG90ZW5jaWFsJCA9IFByZWNpbyBkZSB2ZW50YSBwb3RlbmNpYWwNCiogJFBleHRfe3BldHLDs2xlb30kID0gUHJlY2lvIGRlIGV4cG9ydGFjacOzbi9yZWZlcmVuY2lhIGludGVybmFjaW9uYWwgZGVsIHBldHLDs2xlbyBjcnVkbw0KDQpgYGB7cn0NCiNlc3RpbWFjaW9uIGNvc3RvcyBwcm9waWENCmNvc3RvcyA8LSBwcm9kdWNjaW9uX3RvdGFsICU+JSANCiAgc2VsZWN0KGFuaW8sIHVuaWRhZF9wcm9kdWNjaW9uPXVuaWRhZCwNCiAgICAgICAgIHByb2R1Y2Npb25fY3J1ZG8gPXByb2RfY3J1ZG8sIHByb2R1Y2Npb25fZ2FzPXByb2RfZ2FzLA0KICAgICAgICAgcHJvZHVjY2lvbl90b3RhbD1wcm9kdWNjaW9uX3RvdGFsX2JlcCkgJT4lIA0KIGxlZnRfam9pbihzdG9ja19lc3RpbWFkbyAlPiUNCiAgICAgICAgICAgICAgIGxlZnRfam9pbihpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdChhbmlvLCBpcGNfMTgpKSAlPiUNCiAgICAgICAgICAgICAgIyBmaWx0ZXIodmFyaWFibGUgPT0gInBweWVfZXN0aW1hZG9fYm9sc2FyIikgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoY29uc3Vtb19rX2Zpam8gPSB2YWxvciAqIGlwY18xOCAqIGNvbnN1bW9fa19maWpvX3lwZikgJT4lIA0KICAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sIGNvbnN1bW9fa19maWpvKSkgJT4lDQogIGxlZnRfam9pbih2YWxvcl90b3RhbF9wcm9kdWNjaW9uICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KGFuaW8sIGlwY18xOCkpICU+JSANCiAgICAgICAgICAgICAgbGVmdF9qb2luKHRjcF9hbnVhbF9iICU+JSBzZWxlY3QoLXNvYnJldmFsdWFjaW9uKSkgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih2YXJpYWJsZSAlaW4lIGMoImNpX2V4dHIiLCAibXNfZXh0ciIpLA0KICAgICAgICAgICAgICAgICAgICAgZnVlbnRlJWluJSBjKCJDQ05OIG9maWNpYWwiLCAiRW1wYWxtZSBDQ05OIikpICU+JSAjIkNyaXRlcmlvIENDTk4iDQogICAgICAgICAgICAgIG11dGF0ZSh2YWxvciA9ICh2YWxvcioxMF42KSppcGNfMTgvdGNjLA0KICAgICAgICAgICAgICAgICAgICAgdW5pZGFkID0iVVNEIHRjYyIpICU+JSANCiAgICAgICAgICAgICAgc3ByZWFkKGtleT12YXJpYWJsZSwgdmFsdWU9dmFsb3IpKSAlPiUgDQogIGxlZnRfam9pbihyZW50YV9kaXJlY3RvICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KGFuaW8sICNzdG9ja19zZWxlY2Npb25hZG8sDQogICAgICAgICAgICAgICAgICAgICBwcHllLCB0Z19ub3JtYWwsIHJlbnRhX3RvdGFsKSApICU+JSANCiAgbGVmdF9qb2luKHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8gJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYW5pbywgdW5pZGFkLCBwcmVjaW9fcmVmZXJlbmNpYV9leHRlcm5vID0gcHJlY2lvX21lX2NydWRvKSkgJT4lIA0KICBtdXRhdGUocHB5ZSA9IChwcHllKjEwXjYpKmlwY18xOC90Y2MsDQogICAgICAgICByZW50YV90b3RhbCA9IChyZW50YV90b3RhbCoxMF42KSppcGNfMTgvdGNjLA0KICAgICAgICAgdW5pZGFkX2Nvc3Rvcz0gIlVTRC9ib2UiLA0KICAgICAgICAgY29zdG9zX3RvdGFsZXMgPSAoY2lfZXh0ciArbXNfZXh0ciArIGNvbnN1bW9fa19maWpvKSwNCiAgICAgICAgIGNvc3Rvc190b3RhbGVzX3N1bV9nY2lhX25vcm1hbCA9IGNvc3Rvc190b3RhbGVzICsgKHBweWUgICogdGdfbm9ybWFsKSwNCiAgICAgICAgIHByZWNpb19jb3N0byA9IGNvc3Rvc190b3RhbGVzL3Byb2R1Y2Npb25fdG90YWwsDQogICAgICAgICBwcmVjaW9fY29zdG9fbW1idHUgPSBjb252ZXJzb3JfYmVwTU1CVFVfcChwcmVjaW9fY29zdG8pLA0KICAgICAgICAgcHJlY2lvX3Byb2R1Y2Npb24gPWNvc3Rvc190b3RhbGVzX3N1bV9nY2lhX25vcm1hbC9wcm9kdWNjaW9uX3RvdGFsLA0KICAgICAgICAgcHJlY2lvX3ZlbnRhX3BvdGVuY2lhbCA9IChwcm9kdWNjaW9uX3RvdGFsICpwcmVjaW9fcmVmZXJlbmNpYV9leHRlcm5vIC0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0b3NfdG90YWxlcykvcHJvZHVjY2lvbl90b3RhbCApDQogICAgICAgICAjIHByZWNpb192ZW50YV9wb3RlbmNpYWwgPSAoKHBweWUgKiB0Z19ub3JtYWwpK3JlbnRhX3RvdGFsKS9wcm9kdWNjaW9uX3RvdGFsKQ0KIyAocHJvZHVjY2lvbiB4IHByZWNpbyBpbnRlcm5hY2lvbmFsIC0gY29zdG9zX3RvdGFsZXMpIC8gYmFycmlsZXMgQk9FID0gZ2NpYSArIHJlbnRhIHBvciBiYXJyaWwgDQojZXhwcmVzYXIgZW4gdXNkIHRjYyB5IHRjcA0KY29zdG9zDQoNCmNvc3RvcyAlPiUgDQogICAgICAgICAgIGZpbHRlcihhbmlvID4gMTk5NykgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHByZWNpb19jb3N0bywgY29sb3IgPSBmdWVudGUpKSsgDQogIGdlb21fbGluZShhbHBoYSA9IDAuNSwgc2l6ZSA9IDEuNCkrDQogICAgbGFicyh0aXRsZSA9ICJQcmVjaW8gZGUgY29zdG8iLA0KICAgICAgICAgc3VidGl0bGU9ICJFc3RpbWFjaW9uIHByb3BpYSBhIHBhcnRpciBkZSBDQ05OIHkgcmVlc3RpbWFjaW9uIGRlIFZCUCBjb24gY3JpdGVyaW8gQ0NOTiIsIA0KICAgICAgICAgeSA9ICJVU0QvQk9FIiwgeCA9ICJBw7FvIikNCg0KDQpgYGANCg0KIyBDb21wYXJhY2nDs24gY29uIGVzdGltYWNpw7NuIGRlIG90cm9zIGF1dG9yZXMNCg0KYGBge3J9DQoNCiNyZW50YSB1c2QgdnMgYXV0b3Jlcw0KI2ZhbHRhIGFncmVnYXIgcmVudGFfaGlkcm9jYXJidXJvc19qaw0KcmVudGFfYXV0b3JlcyA8LSByZW50YV9pbmRpcmVjdG8gJT4lIA0KICBzZWxlY3QoYW5pbyx0Y2MsIHRjcCwgaXBjXzE4LCByZXRlbmNpb25lcywgcmVnYWxpYXNfdG90YWwsIGNvbnRhaW5zKCJyZW50YSIpKSAlPiUgDQogIHNlbGVjdCggLSgxMzpuY29sKC4pKSkgJT4lIA0KICBmaWx0ZXIoYW5pbyA+IDE5NjIpICU+JQ0KICBtdXRhdGUoIHJldGVuY2lvbmVzPSByZXRlbmNpb25lcyppcGNfMTgvdGNjLCAgICAgICANCiAgICAgICAgICByZWdhbGlhc190b3RhbCA9IHJlZ2FsaWFzX3RvdGFsKmlwY18xOC90Y2MsIA0KICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8gPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvKmlwY18xOC90Y3AsDQogICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMgPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyppcGNfMTgvdGNwLA0KICAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2NydWRvID0gcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfY3J1ZG8qaXBjXzE4L3RjcCwgIA0KICAgICAgICAgIHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcyA9IHJlbnRhX2V4cG9fc29icmV2YWx1YWRhX2dhcyppcGNfMTgvdGNwICAsDQogICAgICAgICAgcmVudGFfc29icmV2YWx1YWNpb24gPSByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbysgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzLA0KICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MgPSANCiAgICAgICAgICAgIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfZ2FzKyByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2NydWRvLA0KICAgICAgICAgICMgcmVudGFfZW1wcmVzYXMgPSByZW50YV9lbXByZXNhcyppcGNfMTgvdGNjLA0KICAgICAgICAgICMgcmVudGFfZW1wcmVzYXMgPSByZW50YV9lbXByZXNhcyppcGNfMTgvdGNjLA0KICAgICAgICAgIHJlbnRhX3RvdGFsID0gKHJlbnRhX3RvdGFsKmlwY18xOCkgLyB0Y3AsDQogICAgICAgICAgdW5pZGFkID0gIk1pbGxvbmVzIGRlIFVTRCIsDQogICAgICAgICBhdXRvciA9ICJQcm9waWEiKSAlPiUgDQogIHJlbmFtZShyZXRlbmNpb25lcyA9IHJldGVuY2lvbmVzLA0KICAgICAgICAgcmVnYWxpYXMgPSByZWdhbGlhc190b3RhbA0KICAgICAgICAgICMgcmVudGFfZW1wcmVzYXMgPSByZW50YV9lbXByZXNhcywNCiAgICAgICAgICMgcmVudGFfdG90YWxfZ2FzID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsDQogICAgICAgICAjIHJlbnRhX3RvdGFsX2NydWRvID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkbywNCiAgICAgICAgICkgJT4lIA0KICBzZWxlY3QoYW5pbywgdW5pZGFkLCBhdXRvciwgZXZlcnl0aGluZyguKSwgDQogICAgICAgICAtYyhpcGNfMTgsIHRjYywgdGNwLCByZW50YV9leHBvX3NvYnJldmFsdWFkYV9jcnVkbywgcmVudGFfZXhwb19zb2JyZXZhbHVhZGFfZ2FzLA0KICAgICAgICAgICAgcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXMsIHJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3NfY3J1ZG8pKSAlPiUgDQogIGdhdGhlcihrZXkgPSB0aXBvX2RlX3JlbnRhLA0KICAgICAgICAgdmFsdWUgPSB2YWxvciwNCiAgICAgICAgIDQ6bmNvbCguKSkgJT4lIA0KICAgIGJpbmRfcm93cyhyZW50YV9hdXRvcmVzKQ0KIyMjIyMNCg0KDQojZ3JhZmljbyBjb21wYXJhY2lvbiBjb24gb3Ryb3MgYXV0b3Jlcw0KZ3JhZl90aXBvc19yZW50YSA8LSByZW50YV9hdXRvcmVzICU+JSANCiAgZmlsdGVyKCEodGlwb19kZV9yZW50YSVpbiUgYygicmVudGFfdG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbnRhX2VzdGFkb190b3RhbCIpKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KHNpemUgPSAwLjUpKw0KICBmYWNldF93cmFwKH50aXBvX2RlX3JlbnRhLCBzY2FsZXMgPSAiZnJlZV95IikrDQogIGxhYnModGl0bGUgPSAiUmVudGEgaGlkcm9jYXJidXLDrWZlcmEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJDb21wYXJhY2nDs24gZGUgZXN0aW1hY2lvbmVzLiBNaWxsb25lcyBVU0QiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpnZ3Bsb3RseShncmFmX3RpcG9zX3JlbnRhLCB3aWR0aCA9IDgwMCwgaGVpZ2h0ID0gNjAwKSAgDQoNCg0KDQpncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uIDwtIHJlbnRhX2F1dG9yZXMgJT4lIA0KICAjIGZpbHRlcighKGF1dG9yID09ICJQcm9waWEiICYgdGlwb19kZV9yZW50YSA9PSAicmVudGFfdG90YWwiKSkgJT4lDQogICMgbXV0YXRlKHRpcG9fZGVfcmVudGE9IGNhc2Vfd2hlbih0aXBvX2RlX3JlbnRhID09InJlbnRhX2RpZmVyZW5jaWFsX3ByZWNpb3MiICYNCiAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b3IgPT0gIlByb3BpYSIgfiAicmVudGFfdG90YWwiLA0KICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB+IHRpcG9fZGVfcmVudGEpKSAlPiUNCiAgZmlsdGVyKHRpcG9fZGVfcmVudGEgPT0gInJlbnRhX3RvdGFsIikgJT4lIA0KICBnZ3Bsb3QoYWVzKGFuaW8sIHZhbG9yLCBjb2xvciA9IGF1dG9yKSkrDQogIGdlb21fbGluZSgpKw0KICBnZW9tX3BvaW50KCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSsNCiAgbGFicyh0aXRsZSA9ICJSZW50YSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCAocGV0csOzbGVvIHkgZ2FzKSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkNvbiByZW50YSB0b3RhbCBwcm9waWEgbWV0b2RvbG9nw61hIGF1dG9yZXMiLCANCiAgICAgICB5ID0gIk1pbGxvbmVzIGRlIFVTRCIpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9ZnVuY3Rpb24oeCkgZm9ybWF0KHgsIGJpZy5tYXJrID0gIi4iLCBzY2llbnRpZmljID0gRkFMU0UpKQ0KZ3JhZl9yZW50YV90b3RhbF9jb21wYXJhY2lvbg0KDQpnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uLCB3aWR0aCA9IDYwMCwgaGVpZ2h0ID0gNDAwKQ0KIyBnZ3Bsb3RseShncmFmX3JlbnRhX3RvdGFsX2NvbXBhcmFjaW9uX2IpDQoNCmBgYA0KDQoNCg0KIyBFeHBvcnRhY2lvbiBkZSByZXN1bHRhZG9zDQoNCmBgYHtyfQ0KDQojcmF3IGRhdGEgZm9yIG1ldGFkYXRhDQpkYXRvcyA8LSAgbGlzdCggcHJvZF9tZXJnZV9jcnVkbywgcHJlY2lvX21pX2NydWRvLCBleHBvX3FfY3J1ZG8sIHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sIHByb2RfbWVyZ2VfZ2FzX01NQlRVLCANCiAgIHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QsICBleHBvX3FfZ2FzLCAgcHJlY2lvX21kb211bmRpYWxfZ2FzX01NQlRVLCBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcywNCiAgIGdhbmFuY2lhX3lfcGJpLCB0Y3BfYW51YWxfYiwgaXBjX3Byb21lZGlvICwgcmVudGFfaW5kaXJlY3RvWyxjKDE6MTMsIDE3KV0sIHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvWywtMTRdLCANCiByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhc1ssLTEzXSwgcmVudGFfdGNwX2NydWRvWywtYygxMjoxMyldLCByZW50YV90Y3BfZ2FzLCByZWdhbGlhc191c2QsIHJldGVuY2lvbmVzX2NydWRvLCBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcywgDQogcmVudGFfcHJvZHVjY2lvbl9iYWxhbmNlcyAsIGNyaXRlcmlvX3Byb3BpbywgcmVudGFfZGlyZWN0bywgcmVudGFfZGlyZWN0b19wYmlbLGMoMSwxNDoxNSldLCANCiByZW50YV9pbmRpcmVjdG9bLGMoMSwxOToyMCldLCAgY2Nubl9vZmljaWFsLCBjcml0ZXJpb19jY25uLCBlbXBhbG1lX2Njbm4sIGNyaXRlcmlvX3Byb3BpbywgDQpyZW50YV9hdXRvcmVzLCByZW50YV9lbXByZXNhc19iYWxhbmNlcywgIHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLCB1bmlvbl9zZWdtZW50b3MsIGNvc3RvcykNCg0KIyMgdmFyaWFibGVzIGRlIHRvZG9zIGxvcyBkYXRhZnJhbWVzDQpjb2x1bW5hcyA8LSBjKCkNCmZvcihpIGluIDE6bGVuZ3RoKGRhdG9zKSl7DQogIGNvbHVtbmFzIDwtIGMoY29sdW1uYXMsIGNvbG5hbWVzKGRhdG9zW1tpXV0pKQ0KfQ0KDQpsaXN0X2NvbCA8LSAgYXMuZGF0YS5mcmFtZSh1bmlxdWUoY29sdW1uYXMpKQ0KDQoNCiMgeCA8LSByZWFkeGw6OnJlYWRfZXhjZWwoImNvbHVtbmFzLnhsc3giKSAlPiUgDQojICAgIyByZW5hbWUodmFyaWFibGUgPSAidW5pcXVlKGNvbHVtbmFzKSIpICU+JSANCiMgICBtdXRhdGUodW5pZGFkID0gY2FzZV93aGVuKHN0cl9kZXRlY3QodmFyaWFibGUsIHJlZ2V4KCJnYXN8Ym9saXZpYSIpKSAgJiBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgicHJlY2lvfHByaWNlIikpIH4gIlVTRC9NTUJUVSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiZ2FzfGxuZyIpKSAgJiBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgicHJvZCIpKSB+ICJNTUJUVSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiY3J1ZG98cGV0cm9sZW8iKSkgICYgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoInByZWNpbyIpKSB+ICJVU0QvQmFycmlsIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QodmFyaWFibGUsIHJlZ2V4KCJjcnVkb3xwZXRyb2xlbyIpKSB+ICJCYXJyaWxlcyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCByZWdleCgiY3J1ZG98cGV0cm9sZW8iKSkgICYgc3RyX2RldGVjdCh2YXJpYWJsZSwgcmVnZXgoInByb2R8ZXhwbyIpKSB+ICJCYXJyaWxlcyIpKQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeCh4LCBwYXRoID0gICJjb2x1bW5hcy54bHN4IikNCg0KYGBgDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMjIEV4cG9ydGFjacOzbiBkZSByZXN1bHRhZG9zDQpwcm9kX21lcmdlX2NydWRvX2V4IDwtIHByb2RfbWVyZ2VfY3J1ZG8gJT4lIA0KICByZW5hbWUocmVnYWxpYXNfcHJvZCA9IHJlZ2FsaWFzLCBtZWNvbl9wcm9kPSBtZWNvbiwgc2VzY29fcHJvZCA9IHNlc2NvLA0KICAgICAgICAgYW51YXJpb19wcm9kID0gYW51YXJpb19jb21idXN0aWJsZXMgLCBzZWNfZW5lcmdpYV9wcm9kID0gY3J1ZG9fc2VjX2VuZXJnaWEgLCBlaWFfcHJvZCAgPWVpYSkNCnByb2RfbWVyZ2VfZ2FzX01NQlRVX2V4IDwtIHByb2RfbWVyZ2VfZ2FzX01NQlRVICU+JSANCiAgcmVuYW1lKHJlZ2FsaWFzX3Byb2QgPSByZWdhbGlhcywgbWVjb25fcHJvZD0gbWVjb24sIHNlc2NvX3Byb2QgPSBzZXNjbywNCiAgICAgICAgIGFudWFyaW9fcHJvZCA9IGFudWFyaW9fY29tYnVzdGlibGVzICwgZWlhX3Byb2QgID1laWEpDQpwcmVjaW9fbWlfY3J1ZG9fZXggPC0gcHJlY2lvX21pX2NydWRvICU+JSANCiAgcmVuYW1lKGlkZWVfcHJlY2lvID0gaWRlZSwgcmVnYWxpYXNfcHJlY2lvID0gcmVnYWxpYXMsIG1lY29uX3ByZWNpbyA9IG1lY29uLCANCiAgICAgICAgIHlwZl9wcmVjaW8gPSB5cGYsIG1lY29uX2Njbm5fcHJlY2lvID0gbWVjb25fY2NubiApDQpwcmVjaW9faW50ZXJub19nYXNfbW1idHVfdXNkX2V4IDwtIHByZWNpb19pbnRlcm5vX2dhc19tbWJ0dV91c2QgJT4lIA0KICByZW5hbWUoaWRlZV9wcmVjaW8gPSBpZGVlLCByZWdhbGlhc19wcmVjaW8gPSByZWdhbGlhcywgbWVjb25fcHJlY2lvID0gbWVjb24sIA0KICAgICAgICAgeXBmX3ByZWNpbyA9IHlwZiwgbWVjb25fY2Nubl9wcmVjaW8gPSBtZWNvbl9jY25uICwgYW51YXJpb19wcmVjaW8gPSBhbnVhcmlvKQ0KDQoNCmNvZWZpY2llbnRlcyA8LSBsaXN0KCJQcm9wb3JjacOzbiBkZSBsb3Mgc2VydmljaW9zIHNvYnJlIGV4dHJhY2Npb24iID0gc2VydmljaW9fc19leHRyYWNjaW9uLA0KICAgICAgICAgICAgICAgICAgICAgIlRhc2EgZGUgZGVwcmVjaWFjacOzbiBkZSBZUEYiID0gY29uc3Vtb19rX2Zpam9feXBmLA0KICAgICAgICAgICAgICAgICAgICAgIkltcHVlc3RvcyBwcm9tZWRpb3MgTUlQIDk3IiA9IGltcF9wcm9tXzk3LA0KICAgICAgICAgICAgICAgICAgICAgIkNvZWZpY2llbnRlIHRlY25pY28gTUlQIDk3IiA9IGNvZWZfdGVjbmljb185NywNCiAgICAgICAgICAgICAgICAgICAgICJQcm9wb3JjacOzbiBkZSBsYSBNYXNhIFNhbGFyaWFsIHRvdGFsIHByb21lZGlvIDIwMDQtMjAxMiI9IG1lYW5fY29lZl9tcyRjb2VmX21zX3RvdCwNCiAgICAgICAgICAgICAgICAgICAgICJQcm9wb3JjacOzbiBkZSBsYSBNYXNhIFNhbGFyaWFsIGV4dHJhY2Npb24gcHJvbWVkaW8gMjAwNC0yMDEyIj0gbWVhbl9jb2VmX21zJGNvZWZfbXNfZXh0ciwNCiAgICAgICAgICAgICAgICAgICAgICJDb2VmaWNpZW50ZSBjb25zdW1vIGludGVybWVkaW8gKEHDsW8pIiA9Y29lZl9jb25zdW1vX2ludGVybWVkaW8kYW5pbywNCiAgICAgICAgICAgICAgICAgICAgICJDb2VmaWNpZW50ZSBjb25zdW1vIGludGVybWVkaW8gKDEtIFZBL1ZCUCkiID1jb2VmX2NvbnN1bW9faW50ZXJtZWRpbyRjb2VmX2NpKQ0KY2FwdHVyZS5vdXRwdXQoY29lZmljaWVudGVzLCBmaWxlID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL2NvZWZpY2llbnRlcy50eHQiKQ0KDQpjb3N0b3NfY29tcGFyYWNpb24gPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9jb3N0b3MueGxzeCIpDQppbmRpY2UgPC0gIHJlYWRfZXhjZWwoIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL21ldGFkYXRhX2FyZy54bHN4Iiwgc2hlZXQgPSAiaW5kaWNlIikNCnZhcmlhYmxlcyA8LSAgcmVhZF9leGNlbCgiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvbWV0YWRhdGFfYXJnLnhsc3giLCBzaGVldCA9ICJ2YXJpYWJsZXMiKQ0Kd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGluZGljZSA9IGluZGljZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXM9IHZhcmlhYmxlcyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGlwb19jYW1iaW8gPSB0Y3BfYW51YWxfYiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpcGMgPSBpcGNfcHJvbWVkaW8gJT4lIHNlbGVjdCgtZmVjaGEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHB2X3lfcGJpID0gZ2FuYW5jaWFfeV9wYmkgLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2Npb25fY3J1ZG8gPSBwcm9kX21lcmdlX2NydWRvX2V4LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNjaW9uX2dhcyA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVX2V4LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2NydWRvID0gZXhwb19xX2NydWRvLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2dhcyA9IGV4cG9fcV9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm9fY3J1ZG8gPSBwcmVjaW9fbWlfY3J1ZG9fZXgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2dhcyA9cHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZF9leCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb3NfZXh0ZXJub19jcnVkbyA9IHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBSVFBHX21lY2FuaXNtb3MgPSByZW50YV9pbmRpcmVjdG9bLGMoMToxMywgMTcpXSAlPiUgZmlsdGVyKGFuaW8gPjE5NjEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJUUEdfUGV4dFEgPSByZW50YV9kaXJlY3RvLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFJUUEdfbWVjYW5pc21vc192c19waWIgPXJlbnRhX2luZGlyZWN0b1ssYygxLDE5OjIwKV0gICU+JSBmaWx0ZXIoYW5pbyA+MTk2MSksDQogICAgICAgICAgICAgICAgICAgICAgICAgUlRQR19QZXh0UV92c19waWIgPSByZW50YV9kaXJlY3RvX3BiaVssYygxLDE0OjE1KV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZG9fZGlmX3ByZWNpb3MgPSByZW50YV9kaWZfcHJlY2lvc19jcnVkb1ssLTE0XSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX2RpZl9wcmVjaW9zID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXNbLC0xM10sDQogICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19zb2JyZXZhbHVhY2lvbiA9IHJlbnRhX3RjcF9jcnVkb1ssLWMoMTI6MTMpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdhc19zb2JyZXZhbHVhY2lvbiA9IHJlbnRhX3RjcF9nYXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmVnYWxpYXNfcGcgPSByZWdhbGlhc191c2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ZW5jaW9uZXNfcGcgPSByZXRlbmNpb25lc19jcnVkbywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzaWRpb3NfcGcgPSBzdWJzaWRpb3NfaGlkcm9jYXJidXJvcywNCiAgICAgICAgICAgICAgICAgICAgICAgICB0Z19wZ190b3RhbCA9cmVudGFfdGcsDQogICAgICAgICAgICAgICAgICAgICAgICAgdGdfcGdfZW1wcmVzYXMgPSByZW50YV9lbXByZXNhc19iYWxhbmNlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ja19wZ19iYWxhbmNlcyA9IHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRvX1lQRl9QZXRCUiA9dW5pb25fc2VnbWVudG9zLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGNjbm5fcGcgPSBjY25uX29maWNpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9fY2Nubl9wZz1jcml0ZXJpb19jY25uICU+JSBzZWxlY3QoLWMoY2lfdG90ICwgY2lfZXh0cikpICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBlbXBhbG1lX2Njbm5fcGc9ZW1wYWxtZV9jY25uLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFZCUGV4dFRjcCAgPWNyaXRlcmlvX3Byb3BpbyAsDQogICAgICAgICAgICAgICAgICAgICAgICAgUlRQR19jb21wYXJhY2lvbiA9IHJlbnRhX2F1dG9yZXMgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0b3NfcGdfY29tcGFyYWNpb24gPSBjb3N0b3NfY29tcGFyYWNpb24gLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0b3NfcGdfY2Nubj1jb3N0b3MpLA0KICAgICAgICAgICAgICAgICAgICBwYXRoID0gIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3JlbnRhX2RlX2xhX3RpZXJyYV9oaWRyb2NhcmJ1cmlmZXJhX2FyZy54bHN4IikNCg0KDQp4IDwtIHJlbnRhX2F1dG9yZXMgJT4lIA0KICBmaWx0ZXIoYW5pbyA+MTk5Nyx0aXBvX2RlX3JlbnRhID09InJlbnRhX3RvdGFsIikgJT4lIA0KICBncm91cF9ieShhbmlvLCB1bmlkYWQsIGF1dG9yKSAlPiUgDQogICMgc3VtbWFyaXNlKHZhbG9yID0gc3VtKHZhbG9yLCBuYS5ybSA9IFQpKSAlPiUgDQogIHNwcmVhZChrZXkgPSBhdXRvciwgdmFsdWUgPSB2YWxvcikgICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gIlJlbnRhIGRlIGxhIHRpZXJyYSBoaWRyb2NhcmJ1csOtZmVyYSB0b3RhbCBkZSBBcmdlbnRpbmEiICkgJT4lIA0KICBzZWxlY3QoIGFuaW8sIHVuaWRhZCwgdmFyaWFibGUsIGV2ZXJ5dGhpbmcoLiksIC10aXBvX2RlX3JlbnRhKQ0KDQp3cml0ZXhsOjp3cml0ZV94bHN4KHgsIHBhdGggPSAiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvdGFibGFfY29tcGFyYWNpb25fYXV0b3Jlcy54bHN4IikNCg0KDQojIEV4cG9ydGFjaW9uIHZpZWphDQoNCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHByb2R1Y2Npb25fY3J1ZG8gPSBwcm9kX21lcmdlX2NydWRvX2V4LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2NydWRvID0gcHJlY2lvX21pX2NydWRvX2V4LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydGFjaW9uX2NydWRvID0gZXhwb19xX2NydWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb3NfZXh0ZXJub19jcnVkbyA9IHByZWNpb3NfcmVmZXJlbmNpYV95X2V4cG9fY3J1ZG8sDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNjaW9uX2dhcyA9IHByb2RfbWVyZ2VfZ2FzX01NQlRVX2V4LCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19pbnRlcm5vX2dhcyA9cHJlY2lvX2ludGVybm9fZ2FzX21tYnR1X3VzZF9leCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRhY2lvbl9nYXMgPSBleHBvX3FfZ2FzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpb19leHRlcm5vX2dhcyA9IHByZWNpb19tZG9tdW5kaWFsX2dhc19NTUJUVSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIHB2X3lfcGJpID0gZ2FuYW5jaWFfeV9wYmkgLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwb19jYW1iaW8gPSB0Y3BfYW51YWxfYiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGlwYyA9IGlwY19wcm9tZWRpbyAlPiUgc2VsZWN0KC1mZWNoYSkpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAgIi4uL3Jlc3VsdGFkb3MvYXJnZW50aW5hL3ZhcmlhYmxlcy54bHN4IikNCg0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChtZXRvZG9faW5kaXJlY3RvID0gcmVudGFfaW5kaXJlY3RvWyxjKDE6MTMsIDE3KV0sDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjcnVkb19kaWZfcHJlY2lvc19tcyA9IHJlbnRhX2RpZl9wcmVjaW9zX2NydWRvWywtMTRdLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FzX2RpZl9wcmVjaW9zX21zID0gcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19nYXNbLC0xM10sDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNydWRvX3NvYnJldmFsdWFjaW9uX21zID0gcmVudGFfdGNwX2NydWRvWywtYygxMjoxMyldLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXNfc29icmV2YWx1YWNpb25fbXMgPSByZW50YV90Y3BfZ2FzLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnYWxpYXMgPSByZWdhbGlhc191c2QsDQojICAgICAgICAgICAgICAgICAgICAgICAgICByZXRlbmNpb25lcyA9IHJldGVuY2lvbmVzX2NydWRvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2lkaW9zID0gc3Vic2lkaW9zX2hpZHJvY2FyYnVyb3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICByZW50YV9iYWxhbmNlcyA9IHJlbnRhX3Byb2R1Y2Npb25fYmFsYW5jZXMgICksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICIuLi9yZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9tZXRvZG9faW5kaXJlY3RvLnhsc3giKQ0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KHZhX2NyaXRlcmlvX3Byb3BpbyA9IGNyaXRlcmlvX3Byb3BpbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRvZG9fZGlyZWN0byA9IHJlbnRhX2RpcmVjdG8pLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfbWV0b2RvX2RpcmVjdG8ueGxzeCIpDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoIG1ldG9kb19kaXJlY3RvX3BiaSA9IHJlbnRhX2RpcmVjdG9fcGJpWyxjKDEsMTQ6MTUpXSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldG9kb19pbmRpcmVjdG9fcGJpPXJlbnRhX2luZGlyZWN0b1ssYygxLDE5OjIwKV0pLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAiLi4vcmVzdWx0YWRvcy9hcmdlbnRpbmEvcmVudGFfc29icmVfcGJpLnhsc3giKQ0KDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChjY25uX29maWNpYWwgPSBjY25uX29maWNpYWwsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb19jY25uPWNyaXRlcmlvX2Njbm4sDQojICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBhbG1lX2Njbm49ZW1wYWxtZV9jY25uLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9fcHJvcGlvID1jcml0ZXJpb19wcm9waW8pLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGg9ICIvQXJjaGl2b3MvcmVwb3MvaGlkcm9jYXJidXJvcy9hbmFsaXNpcy9yZXN1bHRhZG9zL2FyZ2VudGluYS92YWxvcl90b3RhbF9wcm9kdWNjaW9uLnhsc3giKQ0KIyANCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChjb21wYXJhY2lvbl9hdXRvcmVzID0gcmVudGFfYXV0b3JlcyksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9yZW50YV9jb21wYXJhY2lvbl9hdXRvcmVzLnhsc3giKQ0KIyANCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdCggdGdfdG90YWwgPXJlbnRhX3RnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgInJlbnRhIGVtcHJlc2FzIiA9IHJlbnRhX2VtcHJlc2FzX2JhbGFuY2VzLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ja19iYWxhbmNlcyA9IHN0b2NrX2JhbGFuY2VzX2VtcHJlc2FzLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudG9fWVBGX1BldEJSID11bmlvbl9zZWdtZW50b3MpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvYXJnZW50aW5hL3N0b2NrLCB0ZyB5IHJlbnRhIGVtcHJlc2FzIGFyZ2VudGluYS54bHN4IikNCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChjb3N0b3NfY2Nubj1jb3N0b3MpLA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvY29zdG9zX2Njbm4ueGxzeCIpDQoNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QocHJvZHVjY2lvbiA9IHByb2RfbWVyZ2VfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0YWNpb25lcyA9IGV4cG9fcV9jcnVkbywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0ZW5jaWFzID0gZXhpc3RlbmNpYXNfcGV0cm9sZW8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2ludGVybm8gPSBwcmVjaW9fbWlfY3J1ZG8sIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4dGVybm8gPSBwcmVjaW9zX3JlZmVyZW5jaWFfeV9leHBvX2NydWRvLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwID0gdGNwX2FudWFsX2IsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxvID0gcmVudGFfZGlmX3ByZWNpb3NfY3J1ZG8pLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvcmVudGFfZGlmZXJlbmNpYWxfcHJlY2lvc19jcnVkby54bHN4IikNCiMgDQojIHdyaXRleGw6OndyaXRlX3hsc3gobGlzdChwcm9kdWNjaW9uID0gcHJvZF9tZXJnZV9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0YWNpb25lcyA9IGV4cG9fcV9nYXNfTU1CVFUsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaW9faW50ZXJubyA9IHByZWNpb19taV9nYXNfTU1CVFUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lvX2V4dGVybm8gPSBwcmVjaW9fbWRvbXVuZGlhbF9nYXNfTU1CVFUsDQojICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AgPSB0Y3BfYW51YWxfYiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bG8gPSByZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9yZW50YV9kaWZlcmVuY2lhbF9wcmVjaW9zX2dhcy54bHN4IikNCiMgIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KCJjb24gcG96b3MgcGVyZm9yYWRvcyBwb3IgYcOxbyI9IHN0b2NrX2VzdGltYWRvLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICJjb24gc3RvY2sgZGUgcG96b3MiID0gZWplcmNpY2lvX2ZkX3N0b2NrLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgImEgcGFydGlyIFlQRiAoZmx1am8pIiA9IGVqZXJjaWNpb19mZF95cGYpLCANCiMgICAgICAgICAgICAgICAgICAgICBwYXRoID0gInJlc3VsdGFkb3MvZXN0aW1hY2lvbiBkZSBzdG9jayBhIHBhcnRpciBkZSBwb3pvcy54bHN4IikNCg0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImNvbiBwb3pvcyBwZXJmb3JhZG9zIHBvciBhw7FvIj0gc3RvY2tfeV9wb3pvcyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9lc3RpbWFjaW9uIGRlIHN0b2NrIGEgcGFydGlyIGRlIHBvem9zLnhsc3giKQ0KDQojIA0KIyB3cml0ZXhsOjp3cml0ZV94bHN4KGxpc3QoImZsdWpvIj0gY29tcGFyYWNpb25fcG96b3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1am9fdG90YWwiPSBsaXN0YWRvX3Bvem9zLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b2NrIiA9IHBvem9zX2lhcGdfY2VudGVuYXJpbyksIA0KIyAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAicmVzdWx0YWRvcy9hcmdlbnRpbmEvcG96b3MueGxzeCIpDQojIA0KIyANCiMgd3JpdGV4bDo6d3JpdGVfeGxzeChsaXN0KGFmaXAgPSBzdG9ja19hZmlwLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZXNfYm9sc2FyID0gc3RvY2tfYmFsYW5jZXNfZW1wcmVzYXMsDQojICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50b19ZUEZfUGV0QlIgPXVuaW9uX3NlZ21lbnRvcywNCiMgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbHNhcl92MiA9IHN0b2NrX2JhbGFuY2VzX3JhbWEsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52ZXJzaW9uIHBvciBwb3pvIChJQVBHKSIgPSBpbnZlcnNpb25fcG96b3MsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmVyc2lvbiBwb3IgcG96byAoQ2FwIElWKSI9IGludmVyc2lvbl9wb3pvc19jYXBpdiksDQojICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJyZXN1bHRhZG9zL2FyZ2VudGluYS9zdG9ja19wZXRyb2xlby54bHN4IikNCiMgDQoNCg0KDQpwcmludCgiRWwgY8OzZGlnbyB0ZXJtaW7DsyBkZSBjb3JyZXIiKQ0KDQpgYGANCg0KDQoNCg0KDQoNCg0K